这是我的情况:
我正在使用Laravel5.5.x。
我有两个模型,以多种方式链接。
class Artwork extends Model
{
//It has timestamps
protected $table = 'artworks';
protected $fillable = [
'artwork_category_id'
];
public function artworkCategory()
{
return $this->belongsTo('App\Models\ArtworkCategory');
}
}
class ArtworkCategory extends Model
{
use SoftDeletes;
protected $touches = ["artworks"];
/**
* @var string
*/
protected $table = 'artwork_categories';
protected $fillable = [
'category_name',
'acronym',
'deleted_at'
];
public function artworks()
{
return $this->hasMany('App\Models\Artwork');
}
}
触摸正常工作,因此,当我更新艺术品类别时,相关艺术品的updated_at字段也会更新。
但是我需要听每件艺术品上的“触摸”事件。
我尝试在AppServiceProvider的启动方法中插入“更新的”侦听器,但未触发。
Artwork::updated(function ($model){
\Log::debug("HERE I AM");
});
我尝试使用观察者,但是没有运气。
class ArtworkObserver
{
public function updated(Artwork $artwork)
{
dd($artwork);
}
}
AppServiceProvider中的启动方法:
Artwork::observe(ArtworkObserver::class)
题:
有人可以告诉我正确的方法吗?还是告诉我我哪里错了?
我还不够能找到一个可以帮助我做到这一点的例子。
更新资料
我需要实现这一点,因为我必须“解雇” Scout以将更新的数据保存在Artwork索引上的Elasticsearch上。
最佳答案
$touches
最有可能使用批量更新,如果检查Events
的Eloquent
部分,则会发现以下内容:
通过Eloquent发布批量更新时,不会为更新的模型触发saved
和updated
模型事件。这是因为发布批量更新时实际上从未检索过模型。
我能想到的最好的情况是,在更新Artwork
时,您手动更新了$touches
(而不是ArtworkCategory
):
class ArtworkCategory extends Model
{
use SoftDeletes;
protected $fillable = [
'category_name',
'acronym',
'deleted_at'
];
public function artworks()
{
return $this->hasMany('App\Models\Artwork');
}
public static function boot()
{
parent::boot();
static::updated(function($artworkCategory)
{
$artworkCategory->artworks->each(function($artwork) {
$artwork->setUpdatedAt($artwork->freshTimestamp());
$artwork->save(); /// Will trigger updated on the artwork model
});
});
}
}