アプリの移行ファイルの作成プロセス中に、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()');