Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Laravel, create MySQL trigger from Migration

I have created MySQL stored procedure from migration and it works just fine.

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

Hereafter I tried to do the same to create MySQL trigger with following code

<?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`');     } } 

But it returns error after I run 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}} 

Question: What is going wrong?

like image 683
Maytham Avatar asked Dec 10 '14 21:12

Maytham


1 Answers

There was issue with class naming.

Correct class name could help OR do as I did, Copy your working trigger code temporary in notepad/text. Delete the old migration trigger file and generate new one.

Note: By the way the same solution is valid for Laravel 4.x and Laravel 5.x

In Laravel 4

php artisan generate:migration create_trigger 

In Laravel 5

php artisan make:migration create_trigger 

After it was generated I copy and paste the same Trigger code from my notepad/text and it works just fine.

Here is the final working code for creating trigger through migration.

it works both with RAW and UNPREPARED method.

<?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`');     } } 

Note: This is just example to demonstrate the concept

like image 97
Maytham Avatar answered Oct 08 '22 00:10

Maytham