这是我的情况: 我正在使用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上。
答案 0 :(得分:2)
很可能$touches
使用大量更新,如果您查看Eloquent
的{{3}}部分,则会发现以下内容:
通过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
});
});
}
}