17

有没有办法在 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()函数中运行它时,我收到此错误:

在此处输入图像描述

4

2 回答 2

32

您的代码有两个主要问题

  1. DELIMITER不是有效的 sql 语句。这只是一个 MySql 客户端命令。所以不要使用它。顺便说一句,您得到的错误正是告诉您这一点。
  2. 您不能用于DB::statement执行CREATE PROCEDURE代码,因为它使用准备好的语句源代码Connection。您可以改用PDOexec() 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');
    }
}
于 2013-08-23T02:37:01.450 回答
13

对于寻找 @Johannes 提到的 laravel 链接的开发人员。

有什么方法可以在迁移中创建 MYSQL 过程?由@aheissenberger 回答。

我使用它,它对我很有效:

public function up() {            
    DB::unprepared('CREATE PROCEDURE get_highscore() BEGIN SET time_zone = \'Europe/Berlin\'; SET @refscore :=0; SELECT * FROM test; END');
}

public function down() {
    DB::unprepared('DROP PROCEDURE IF EXISTS get_highscore');
}

要在代码中调用过程:

DB::unprepared('CALL get_highscore()');

如果您期望结果表:

DB::statement('CALL update_highscore()');

如果您期望变量:

DB::statement('CALL update_ranking(3,10,@olduser,@newuser)');
$dberg = DB::select('select @olduser as old, @newuser as new');
于 2014-12-10T02:06:49.973 回答