13

在Laravel 4遷移中是否有方法生成存儲的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()功能運行此我得到這個錯誤:

enter image description here

回答

26

您的代碼有兩個主要問題

  1. DELIMITER不是有效的sql語句。這只是一個MySql客戶端命令。所以只是不要使用它。 BTW你得到的錯誤告訴你這一點。
  2. 您不能使用DB::statement來執行CREATE PROCEDURE代碼,因爲它使用了準備好的語句source code for 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'); 
    } 
} 
+5

只是想提一下,Laravel論壇上的某些人指出,你甚至不需要使用PDO對象,只需調用'DB :::準備($ sql)',它就可以工作。當然,最終可能歸結爲相同的東西,但代碼少:) – Johannes

11

同胞開發尋求通過@Johannes提到laravel的鏈接。

Any way to create MYSQL Procedures in Migrations?回答@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');