Podczas procesu tworzenia plików migracji mojej aplikacji zauważyłem, że Laravel nie obsługuje wyzwalaczy bazy danych! I pogodzić się z faktem, że muszę wykonać instrukcję zapytania do osiągnięcia tego celu, ale również daje mi kłopoty .. Oto fragment kodu z mojej aplikacji:Instrukcja Laravel 4 Utwórz wyzwalacz
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()');
Kiedy biegnę rzemieślnik migrują to daje mi następujący błąd:
[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 ( ))
Czy są jakieś rozwiązania oprócz tworzenia własnego obiektu PDO i wykonywania zapytania poza Laravel? Czy jest to wyjątek MySQL lub wyjątek Laravel?
EDIT
Sądząc po wyjątku, to jasne, że przygotowane oświadczenia nie wspierać tworzenie wyzwalaczy .. nie wiem, dlaczego, ale chcielibyśmy pewien wgląd. Aby obejść to, po prostu uruchomiłem własne zapytanie 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()');
, podczas gdy wybrana odpowiedź jest prosta i "elokwentna", nie rozwiązuje problemu poważnej integralności bazy danych. Powinieneś spróbować owinąć kod bazy danych w transakcję, aby wszystko zawieść, jeśli coś się nie powiedzie. –
Czy miałeś szczęście? – laviku