一尘不染

在Laravel 4迁移中创建MYSQL过程

mysql

有没有办法在Laravel 4迁移中生成存储的MYSQL过程?

例如,这是一个简单的过程生成查询,以字符串形式存储(通过Heredoc

    $query = <<<SQL
DELIMITER $$
DROP PROCEDURE IF EXISTS test$$
CREATE PROCEDURE test()
BEGIN
    INSERT INTO `test_table`(`name`) VALUES('test');
END$$
DELIMITER ;
SQL;

    DB:statement(DB::RAW($query));

在迁移up()函数中运行此命令时,出现以下错误:

在此处输入图片说明


阅读 265

收藏
2020-05-17

共1个答案

一尘不染

您的代码有两个主要问题

  1. DELIMITER不是有效的sql语句。这只是一个MySql客户端命令。因此,请不要使用它。 顺便说一句 ,您得到的错误恰恰告诉您。
  2. 您无法使用DB::statement来执行CREATE PROCEDURE代码,因为它使用的预准备语句源代码Connection。您可以使用PDO 来代替exec() DB::connection()->getPdo()->exec()

话虽如此,虚tags表的样本迁移可能看起来像这样

class CreateTagsTable extends Migration {

    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('tags', function($table){
            $table->increments('id');
            $table->string('name')->unique();
        });
$sql = <<<SQL
DROP PROCEDURE IF EXISTS sp_insert_tag;
CREATE PROCEDURE sp_insert_tag(IN _name VARCHAR(32))
BEGIN
    INSERT INTO `tags`(`name`) VALUES(_name);
END
SQL;
        DB::connection()->getPdo()->exec($sql);
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        $sql = "DROP PROCEDURE IF EXISTS sp_insert_tag";
        DB::connection()->getPdo()->exec($sql);
        Schema::drop('tags');
    }
}
2020-05-17