Реализация Laravel Eloquent Events

Я обновляю свой экземпляр модели или вставляю новый, например:

$model = Model::updateOrCreate([id' => $request['id']],
$model_to_update_array);

Я хочу выполнить некоторый код только тогда, когда существующий экземпляр модели ("турист") был обновлен (а НЕ когда был создан новый или ничего не изменилось).

Я прочитал https://laravel.com/docs/5.4/eloquent#events о событиях Eloquent, и мне кажется, что мне нужно использовать событие updated или updating. Насколько я понимаю, эти события «встроены» в Laravel, поэтому мне не нужно использовать много вещей отсюда: https://laravel.com/docs/5.4/events

Я не нашел учебник, показывающий, как реализовать события Eloquent. Поскольку я совсем новичок в концепции событий, мне трудно понять, как их использовать. Может ли кто-нибудь скинуть ссылку на хороший туториал о событиях Eloquent (не событиях вообще, а событиях Eloqeunt в частности) или, может быть, это можно кратко объяснить здесь?

Заранее спасибо!


person Sergej Fomin    schedule 15.08.2017    source источник


Ответы (2)


Самый простой способ добавить событие Eloquent для конкретной модели — перезаписать его метод boot():

protected static function boot()
{
    parent::boot();

    static::updating(function ($model) {

    });
}

Когда вы поместите это в свою модель, анонимная функция будет запускаться каждый раз, когда модель обновляется. Обратите внимание, что существует разница между вызовами static::updating() и static::updated() в зависимости от того, когда вы хотите выполнить свой код.

person thefallen    schedule 15.08.2017
comment
Спасибо, Падший. Где можно прочитать о разнице (обновление, доработка)? - person Sergej Fomin; 15.08.2017
comment
@SergejFomin, в документации об этом мало говорится, но в основном *ing события вызываются до фактического события, а *ed вызываются после события. Итак, в вашем случае, если вы поместите свой код в static::updating(), он будет работать до фактического обновления базы данных, а в static::updated() он будет работать после этого. - person thefallen; 15.08.2017
comment
Привет! Поэтому я включил защищенную статическую функцию boot().... в свою модель. Как мне использовать его, чтобы проверить, была ли модель обновлена ​​​​в контроллере? - person Sergej Fomin; 15.08.2017
comment
@SergejFomin, пожалуйста, задайте еще один вопрос с соответствующим кодом контроллера. - person thefallen; 15.08.2017
comment
я разместил новый вопрос: stackoverflow.com/questions/45698659/ - person Sergej Fomin; 15.08.2017

@TheFallen дал отличный ответ на эту проблему в другой ветке StackOverflow, прочитайте, если вас интересует подробное объяснение решения:

Laravel Eloquent Events - реализовать сохранение модели при обновлении

person Sergej Fomin    schedule 16.08.2017