【问题标题】:How to use triggers in laravel?如何在 laravel 中使用触发器?
【发布时间】:2019-10-31 13:38:22
【问题描述】:

我的代码,使用 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;
  ');
}

【问题讨论】:

  • 欢迎来到 SO!请澄清您的具体问题或添加其他详细信息以准确突出您的需求。正如目前所写的那样,很难准确地说出你在问什么。请参阅How to Ask 页面以获得澄清此问题的帮助。

标签: mysql database laravel triggers laravel-5.7


【解决方案1】:

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

首先,你应该像这样为你的模型创建观察者

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

【讨论】:

  • 模型事件很好,但如果记录被其他应用程序修改,它们将不起作用。
  • 有没有办法查看被其他应用程序(即 API)修改的记录?
【解决方案2】:

试试这个: 请检查您的 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

希望对你有帮助

【讨论】:

    【解决方案3】:

    对于这种类型的操作,laravel 做了一些类似于 trigger(event) 的技术。 如果您有多个事件,请使用观察者,否则您可以选择此解决方案。

    // inside your model
    
    public function boot()
    {
        parent::boot();
    
        // beforeCreate
        self::creating(function($model) {
            // do something with your $model before saving....
    
            // return true or the save will cancel....
            return true;
        });
    
    
        // afterCreate
        self::created(function($model) {
            // do something with your $model after saving....
    
            // return true or the save will cancel....
            return true;
        });
    
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-03
      • 2020-10-16
      • 1970-01-01
      • 2021-02-08
      • 1970-01-01
      • 2018-08-22
      • 1970-01-01
      • 2021-09-01
      相关资源
      最近更新 更多