[英]How to create a MySQL trigger with condition and without delimiter for Laravel migration?
[英]Laravel, create MySQL trigger from Migration
我已经从迁移创建了 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
在 Laravel 4
php artisan generate:migration create_trigger
在 Laravel 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`');
}
}
注意:这只是演示概念的示例
在根目录(与artisan
相同的地方)运行composer dumpautoload
应该可以使它工作。
在 Laravel 5.5 中仅适用于DB::unprepared()
unprepared DB::unprepared()
方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.