如何在laravel中使用触发器?

问题描述 投票:0回答:2

我的代码,使用PHP artisan make:migration create_trigger命令

public function up()
{
  DB::unprepared(' 
  CREATE TRIGGER roll_no BEFORE INSERT ON `students` FOR EACH ROW 
  BEGIN 
  SET @roll_num = IFNULL((substring((SELECT student_roll_no FROM students WHERE
    class_code = NEW.class_code ORDER BY created_at DESC LIMIT 1),-2) + 1), `1`),
    NEW.student_roll_no = CONCAT(
    YEAR(CURRENT_DATE),
    NEW.class_code,
    IF (@roll_num < 10, CONCAT(`0`, @roll_num), @roll_num) 
  )
  END;
  ');
}
mysql database laravel triggers laravel-5.7
2个回答
1
投票

您无需为模型事件创建迁移。 Laravel雄辩有多个事件,如retrieved, creating, created, updating, updated, saving, saved, deleting, deleted, restoring, restored,你可以轻松使用它们。

首先,您应该像这样为您的模型创建Observer

php artisan make:observer UserObserver --model=User

在UserObserver中,您可以收听您喜欢的任何事件,例如:

class UserObserver
{
    /**
     * Handle the User "created" event.
     *
     * @param  \App\User  $user
     * @return void
     */
    public function created(User $user)
    {
        //
    }

    /**
     * Handle the User "updated" event.
     *
     * @param  \App\User  $user
     * @return void
     */
    public function updated(User $user)
    {
        //
    }
}

之后你应该注册你的观察者在app/providers/AppServiceProvider启动方法中建模,例如:

public function boot()
{
     User::observe(UserObserver::class);
}

有关更多详细信息,请访问Laravel documentation


0
投票

试试这个:请检查你的SQL语法

DB::unprepared('CREATE TRIGGER roll_no BEFORE INSERT ON `students` FOR EACH ROW
        BEGIN
            SET @roll_num = IFNULL((substring((SELECT student_roll_no FROM students WHERE class_code = NEW.class_code ORDER BY created_at DESC LIMIT 1),-2) + 1), `1`),
            NEW.student_roll_no = CONCAT(YEAR(CURRENT_DATE)),
            NEW.class_code,
            IF (@roll_num < 10,
                CONCAT(`0`, @roll_num),
                @roll_num
            )
        END');

例如,请检查此链接:

[https://itsolutionstuff.com/post/how-to-add-mysql-trigger-from-migrations-in-laravel-5example.html]1

我希望能帮助你

© www.soinside.com 2019 - 2024. All rights reserved.