【问题标题】:Laravel, create MySQL trigger from MigrationLaravel,从迁移创建 MySQL 触发器
【发布时间】:2014-12-10 21:13:26
【问题描述】:

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

问题:出了什么问题?

【问题讨论】:

  • 发布整个文件。看起来你的班级名称有误?
  • 我现在已经解决了,谢谢这是类名的问题

标签: php laravel laravel-5 triggers migration


【解决方案1】:

类命名存在问题。

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

注意:顺便说一句,同样的解决方案对 Laravel 4.x 和 Laravel 5.x 有效

在 Laravel 4 中

php artisan generate:migration create_trigger

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

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

【讨论】:

  • 对于我来说,创建触发器的迁移运行成功,但我在数据库中找不到触发器。你能帮忙吗
  • 根据我的经验,DB::unprepared(...) 为我工作
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    在 Laravel 5.5 中仅适用于 DB::unprepared() 方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-04
      • 2018-08-21
      • 1970-01-01
      • 1970-01-01
      • 2019-01-19
      • 1970-01-01
      • 2017-05-25
      • 2011-02-03
      相关资源
      最近更新 更多