Массовое обновление Laravel, все еще пожарное событие - PullRequest
1 голос
/ 25 мая 2019

Как указано в документе, laravel не будет запускать событие при массовом обновлении / вставке / удалении. https://laravel.com/docs/5.8/eloquent#events

Для этого он использует Builder и не будет запускать событие.

Можно ли, например, запустить событие после массового обновления? Мне понадобится только построитель запросов для извлечения необходимой информации самостоятельно (для целей ведения журнала).

Ответы [ 2 ]

1 голос
/ 25 мая 2019

@ Паоло при пакетном запросе не будет регистрировать событие, которое необходимо выполнить для выполнения операции с отдельной записью .. как

Analytic::where('id', '>', 100)->get()->each(function($analytic) {
    $analytic->delete();
});
0 голосов
/ 25 мая 2019

На самом деле это возможно, но вы должны расширить Eloquent Builder, переписать методы update / insert и отправить событие туда.Просто играл с этим ... Нужно работать, но основная идея заключается в следующем:

class Test extends Model
{
    protected $guarded = [];

    public $dispatchesEvents = [
        'saved' => SavedTest::class
    ];


    /**
     * INCLUDE this as a trait in your model.
     * Overwrite the eloquentBuilder.
     *
     * @param  \Illuminate\Database\Query\Builder  $query
     * @return \Illuminate\Database\Eloquent\Builder|static
     */
    public function newEloquentBuilder($query)
    {

        return new TestBuilder($query);
    }


}

Расширение красноречивого построителя ...

class TestBuilder extends Builder
{

    /**
     * Update a record in the database and fire event.
     *
     * @param  array  $values
     * @return int
     */
    public function update(array $values)
    {

        // normal eloquent behavior.
        $result =$this->toBase()->update($this->addUpdatedAtColumn($values));

        /*
         * Fire event.
         */
        if($result){
            if( $event = Arr::get($this->model->dispatchesEvents,'saved')){

                 // at the attributes.
                $this->model->fill($this->addUpdatedAtColumn($values));

                $queryBuilder =$this->toBase();

                event(new $event($this->model,$queryBuilder));
            }

        }

    }

    public function insert(array $values)
    {

       // same idea..
    }
}

Класс события:

class SavedTest
{
    use SerializesModels;
    public $model;
    public $query;

    /**
     * Create a new event instance.
     *
     * @return void
     */
    public function __construct($model,$query =null)
    {
        $this->model = $model;
        $this->query = $query;
    }


}

Слушатель.

class SavedTestEvent
{


    /**
     * Create the event listener.
     *
     * 
     */
    public function __construct()
    {

    }

    /**
     * Handle the event.
     *
     * @param  object  $event
     * @return void
     */
    public function handle($event)
    {

        // The model , with the attributes.
        dump($event->model);

       // the query builder , you could extract the wheres or whatever to build your own log for it.
      dump($event->query); 


    }
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...