关于使用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
});
}
所以只是重复我在开头所说的问题:
理解这一过程的任何指导都将不胜感激,谢谢!
答案 0 :(得分:5)
数据库中保存的模型周围有3个事件。这些是created
,updated
和saved
。
created
。
updated
。
saved
。
所以saved
是一个全能的。
此外,刚刚创建模型时,它将wasRecentlyCreated
属性设置为true。
因此,如果您只有一个saved
事件,您仍然可以通过检查该属性来处理创建和更新之间的区别。
关于你如何处理代码,这取决于你。
就个人而言,如果我在创建模型时只需要一些代码,我就会使用该方法。同样为更新。
但是如果我每次保存模型时都需要一些共享代码,但在创建模型时还需要一些特殊的代码,我不会创建一个单独的created
事件,我就是&#39 ; d只需使用saved
并检查wasRecentlyCreated
。