Я создал MySQL хранимую процедуру из миграции, и она работает нормально.
DB::unprepared(' CREATE PROCEDURE sp_Create_Default_Task_1(IN _kid_id INT) BEGIN INSERT INTO tasks (kid_id, name) VALUES (_kid_id, \'daily\'); END' );
В дальнейшем я попытался сделать то же самое, чтобы создать триггер MySQL с последующим кодом
<?php use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class CreateTrigger extends Migration { public function up() { DB::unprepared(' CREATE TRIGGER tr_Task_Default AFTER INSERT ON `kids` FOR EACH ROW INSERT INTO tasks (`kid_id`, `name`) VALUES (NEW.id, \'Default\'); '); } public function down() { DB::unprepared('DROP TRIGGER `tr_User_Default_Member_Role`'); } }
Но он возвращает ошибку после запуска php artisan migrate
{"error":{"type": "Symfony\\Component\\Debug\\Exception\\FatalErrorException", "message":"Class 'CreateTriggers' not found", "file":"C:\\xampp\\htdocs\\dev03\\vendor\\laravel\\framework \\src\\Illuminate\\Database\\Migrations\\Migrator.php", "line":301}}
Вопрос: Что происходит не так?
Возникла проблема с присвоением классов.
Правильное имя класса может помочь или сделать то же, что и я, скопируйте рабочий код запуска в блокнот / текст. Удалите старый файл триггера миграции и создайте новый.
Примечание. Кстати, одно и то же решение действительно для Laravel 4.x и Laravel 5.x
В Ларавеле 4
php artisan migrate:make create_trigger
В Ларавеле 5
php artisan make:migration create_trigger
После того, как он был сгенерирован, я копирую и вставляю тот же код триггера из своего блокнота / текста, и он отлично работает.
Вот окончательный рабочий код для создания триггера через миграцию.
он работает как с методом RAW
и с UNPREPARED
.
<?php use Illuminate\Database\Migrations\Migration; class CreateTrigger extends Migration { public function up() { DB::unprepared(' CREATE TRIGGER tr_User_Default_Member_Role AFTER INSERT ON `users` FOR EACH ROW BEGIN INSERT INTO role_user (`role_id`, `user_id`, `created_at`, `updated_at`) VALUES (3, NEW.id, now(), null); END '); } public function down() { DB::unprepared('DROP TRIGGER `tr_User_Default_Member_Role`'); } }
Примечание. Это просто пример демонстрации концепции
Запустить composer dumpautoload
в корне (то же самое место, что и artisan
) должен заставить его работать.