2013-03-25 13 views
6

マイアプリのマイグレーションファイルの作成プロセス中に、Laravelがデータベーストリガーをサポートしていないことに気付きました!ここに..私は、私はこれを達成するために、クエリ文を実行する必要があるという事実を条件になってきたが、それはまた、私のトラブルを与えている私のアプリからのコードスニペットです:私は職人の移行を実行するとLaravel 4データベースステートメント作成トリガー

Schema::create('users', function ($table) { 
    $table->increments('id'); 
    $table->string('uuid', 36); 
    $table->string('email', 255); 
    $table->string('password', 255); 
}); 
DB::statement('CREATE TRIGGER users_trigger_uuid BEFORE INSERT ON users FOR EACH ROW SET NEW.uuid = UUID()'); 

[Exception]
SQLSTATE[HY000]: General error: 2030 This command is not supported in the prepared statement protocol yet (SQL: CREATE TRIGGER users_trigger_uuid BEFORE INSERT ON users FOR EACH ROW SET NEW.uuid = UUID()) (Bindings: array ( ))

私自身のPDOオブジェクトを作成してLaravel以外のクエリを実行する以外に解決策はありますか?これはMySQLの例外かLaravelの例外ですか?例外から判断

EDIT

は、それが準備された文が、なぜ..わからないトリガの作成をサポートしていませんが、いくつかの洞察を愛することは明らかです。これを回避するために、自分のPDOクエリを実行しました。

$default_driver = Config::get('database.default'); 
$connection_info = Config::get('database.connections.' . $default_driver); 
$conn = new PDO('mysql:host=' . $connection_info['host'] . ';dbname=' . $connection_info['database'], $connection_info['username'], $connection_info['password']); 
$conn->query('CREATE TRIGGER users_trigger_uuid BEFORE INSERT ON ' . $connection_info['prefix'] . 'users FOR EACH ROW SET NEW.uuid = UUID()'); 
+0

あなたが選んだ答えはシンプルで「雄弁」ですが、深刻なデータベースの整合性の問題には対処しません。何かが失敗した場合、すべてが失敗するように、データベースコードをトランザクション内でラップしてください。 –

+0

これで運が良かったですか? – laviku

答えて

8

DB :: unprepared()は、チャームのように動作します。

2

あなたの編集で表示される解決方法が正しくありません。 DB::unprepared()を使用するか、またはPDOを使用する必要がある場合はのようにしてください。。代わりに、接続からPDOオブジェクトを取得し、それを使用:

$pdo = DB::connection()->getPdo();

4

これを行うには、「クリーン」な方法はデータベース・イベントを使用することです。新しいユーザーインスタンスを作成すると、Laravel4はcreatedイベントを発生させます。 this answerを参照して、PHPでUUIDを生成する方法については

class User extends Eloquent ... { 

    // ... 

    public static function boot() 
    { 
     parent::boot(); 
     static::creating(function($user) 
     { 
      $user->uuid = uuid(); 
     }); 
    } 

Eloquent models fire several events, allowing you to hook into various points in the model's lifecycle using the following methods: creating, created, updating, updated, saving, saved, deleting, deleted.

Whenever a new item is saved for the first time, the creating and created events will fire. If an item is not new and the save method is called, the updating/updated events will fire. In both cases, the saving/saved events will fire.

だから、あなたのUserクラスの内部で、creatingイベントのリスナーを追加します。

+0

このソリューションを使用する場合は非常に注意する必要があります。データベース修正コードがトランザクションにラップされているようには見えません。あなたのデータベースは慎重でないとひどい状態になる可能性があります。 –

+0

創造は原子でなければなりません。ここでは実際にINSERTされる前に*タプル*を修正しています。しかし、 "vendor/laravel/framework/src/Illuminate/Database/Connection.php'' run()メソッドを変更またはオーバーライドすることによって、ステートメントを処理することは可能です。 – LSerni

関連する問題