在Laravel 4迁移中创建MYSQL过程

Joh*_*nes 15 mysql stored-procedures database-migration laravel laravel-4

有没有办法在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));
Run Code Online (Sandbox Code Playgroud)

在迁移up()功能中运行此命令时出现此错误:

在此输入图像描述

pet*_*erm 29

您的代码有两个主要问题

  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');
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 只是想提一下,Laravel论坛上有人指出你甚至不需要使用PDO对象,你可以只调用`DB :: unrepared($ sql)`它也可以正常工作.当然它最终可能归结为同样的事情,但更少的代码:) (7认同)

Vai*_*y07 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');
}
Run Code Online (Sandbox Code Playgroud)

要在代码中调用过程:

DB::unprepared('CALL get_highscore()');
Run Code Online (Sandbox Code Playgroud)

如果你期望得到一个表:

DB::statement('CALL update_highscore()');
Run Code Online (Sandbox Code Playgroud)

如果你期望变量:

DB::statement('CALL update_ranking(3,10,@olduser,@newuser)');
$dberg = DB::select('select @olduser as old, @newuser as new');
Run Code Online (Sandbox Code Playgroud)