触发Laravel事件

时间:2019-02-01 09:01:51

标签: php laravel events laravel-5

这是我的情况: 我正在使用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上。

1 个答案:

答案 0 :(得分:2)

很可能$touches使用大量更新,如果您查看Eloquent的{​​{3}}部分,则会发现以下内容:

  

通过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
            });
       });       
   }    
}