Огонь Laravel события на ощупь - PullRequest
0 голосов
/ 01 февраля 2019

это мой сценарий: я использую Laravel 5.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');
    }
}

Сенсорное управление работает правильно, поэтому при обновлении категории художественных работ поле связанных с ними произведений обновляется.

Но мне нужнослушайте «прикосновение» к каждому произведению искусства.Я пытался вставить «обновленный» слушатель при загрузочном методе в 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 для сохранения обновленных данных на Elasticsearch наУказатель произведений искусства.

1 Ответ

0 голосов
/ 01 февраля 2019

Скорее всего $touches использует массовое обновление , и если вы отметите Events секцию Eloquent, вы найдете следующее:

При выпуске массового обновления через Eloquent события модели saved и updated не будут запускаться для обновленных моделей .Это потому, что модели никогда не извлекаются при массовом обновлении.


Лучшее, что я могу придумать, это то, что вы обновляете Artwork s вручную (вместо $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
            });
       });       
   }    
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...