6

アプリの移行ファイルの作成プロセス中に、Laravel がデータベース トリガーをサポートしていないことに気付きました。これを達成するにはクエリステートメントを実行する必要があるという事実に同意しましたが、それも問題を引き起こしています..これは私のアプリのコードスニペットです:

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()');

artisan migrate を実行すると、次のエラーが表示されます。

[例外]
SQLSTATE[HY000]: 一般エラー: 2030 このコマンドは、準備済みステートメント プロトコルではまだサポートされていません (SQL: CREATE TRIGGER users_trigger_uuid BEFORE INSERT ON users FOR EACH ROW SET NEW.uuid = UUID()) (バインディング: 配列 ( )))

独自の PDO オブジェクトを作成し、Laravel の外部でクエリを実行する以外に解決策はありますか? これは MySQL の例外ですか、それとも Laravel の例外ですか?

編集

例外から判断すると、準備されたステートメントがトリガーの作成をサポートしていないことは明らかです..理由はわかりませんが、洞察が欲しいです. これを回避するために、私は独自の 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()');
4

3 に答える 3

8

DB::unprepared() を使用すると、魅力的に機能します。

于 2013-04-21T21:17:20.170 に答える
4

これを行う「クリーンな」方法は、データベース イベントを使用することです。新しい User インスタンスを作成すると、Laravel4 はcreatedイベントを発生させます。

Eloquent モデルはいくつかのイベントを発生させ、作成、作成、更新、更新、保存、保存、削除、削除のメソッドを使用して、モデルのライフサイクルのさまざまなポイントにフックできます。

新しいアイテムが初めて保存されるときはいつでも、creating および created イベントが発生します。アイテムが新しくなく、save メソッドが呼び出されると、updated/updated イベントが発生します。どちらの場合も、保存/保存されたイベントが発生します。

したがって、 User クラス内に、creatingイベントのリスナーを追加します。

class User extends Eloquent ... {

    // ...

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

PHP で UUID を生成する方法については、この回答を参照してください。

于 2013-08-23T09:50:19.533 に答える
2

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

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

于 2013-06-28T14:26:50.790 に答える