这是我的情况:
我正在使用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最有可能使用批量更新,如果检查EventsEloquent部分,则会发现以下内容:


通过Eloquent发布批量更新时,不会为更新的模型触发savedupdated模型事件。这是因为发布批量更新时实际上从未检索过模型。




我能想到的最好的情况是,在更新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
            });
       });
   }
}

09-25 17:44