保存和创建Eloquent模型事件,并在使用create时调用?

时间:2016-05-11 09:31:56

标签: php laravel events eloquent

关于使用Eloquent模型事件,我想知道模型事件如何响应方法调用,如果与特定事件(常见事件)有任何重叠,如果存在,如何处理为这类事件编写代码?

例如,如果我有一个我打电话给create()的模型,即Model::create($array),据我所知,在幕后,当我致电create() save()时方法称为as shown in the docs

/**
 * Save a new model and return the instance.
 *
 * @param  array  $attributes
 * @return static
 */
public static function create(array $attributes = [])
{
    $model = new static($attributes);
    $model->save();
    return $model;
}

因此,请记住这一点,如果我希望saved()created()事件具有相同的行为,我是否会为saved()创建一个事件事件,不需要担心created()事件,因为create()方法是save()方法的一种包装器(如上所示)。所以我可以这样做:

public static function boot()
{
    parent::boot();

    // covers created and saved events, as create() method triggers save()
    static::saved(function($model) {
        // do xyz
    });
}

或者我是否需要创建两个单独的方法来监听这两个事件?像这样:

public static function boot()
{
    parent::boot();

    static::created(function($model) {
        // do xyz
    });

    static::saved(function($model) {
        // do xyz
    });
}

所以只是重复我在开头所说的问题:

  • 模型事件如何响应方法调用
  • 是否与特定事件有重叠(常见事件,如上所述)
  • 如果有,如何实际编写此类事件的代码

理解这一过程的任何指导都将不胜感激,谢谢!

1 个答案:

答案 0 :(得分:5)

数据库中保存的模型周围有3个事件。这些是createdupdatedsaved

第一次保存模型时会调用

created

随后保存模型时会调用

updated

保存模型时(包括首次创建模型时)会调用

saved

所以saved是一个全能的。

此外,刚刚创建模型时,它将wasRecentlyCreated属性设置为true。

因此,如果您只有一个saved事件,您仍然可以通过检查该属性来处理创建和更新之间的区别。

关于你如何处理代码,这取决于你。

就个人而言,如果我在创建模型时只需要一些代码,我就会使用该方法。同样为更新。

但是如果我每次保存模型时都需要一些共享代码,但在创建模型时还需要一些特殊的代码,我不会创建一个单独的created事件,我就是&#39 ; d只需使用saved并检查wasRecentlyCreated