Laravel,从迁移中创建MySQL触发器

2022-08-30 16:29:37

我已经从迁移中创建了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}}

问题:哪里出错了?


答案 1

类命名存在问题。

正确的类名可以帮助或像我一样,在记事本/文本中临时复制您的工作触发代码。删除旧的迁移触发器文件并生成新的文件。

注意:顺便说一句,相同的解决方案适用于Laravel 4.x和Laravel 5.x

在拉拉维尔 4

php artisan generate:migration create_trigger

在拉拉维尔 5

php artisan make:migration create_trigger

生成后,我从记事本/文本中复制并粘贴相同的触发器代码,它工作正常。

下面是通过迁移创建触发器的最终工作代码。

它既适用于方法,也适用于方法。RAWUNPREPARED

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

注意:这只是演示概念的示例


答案 2

在根目录(与 )相同的位置运行应该可以使其正常工作。composer dumpautoloadartisan


推荐