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

あなたのコードには2つの大きな問題があります

  1. DELIMITERは有効な SQL ステートメントではありません。これは単なる MySql クライアント コマンドです。だから、それを使用しないでください。ところで、あなたが得るエラーはまさにそれを教えてくれます。
  2. の準備済みステートメントソース コードをDB::statement使用するため、 を使用してコードを実行することはできません。代わりにPDO を使用できますCREATE PROCEDUREConnectionexec() 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 に答える