Самый эффективный способ обновить связанную модель из прослушивателя событий

У меня две модели Business а также Products,

У меня есть событие, которое срабатывает при изменении цены продукта, прослушиватель событий рассчитает минимальное и максимальное совокупные значения продуктов для бизнеса и сохранит их в бизнес-модели (хотя я знаю, что это можно сделать динамически, это необходимо для индексация и поиск).

В моем дескрипторе слушателя событий у меня есть следующее:

public function handle(ProductModified $event)
{
    $business = $event->product->business;

    $aggregate_values = Product::join('business', 'product.business_id', '=', 'business.id')->where('business.business_id', '=', $business->id)->groupBy('business.business_id')->get(['product.business_id', DB::raw('max(product.price) as max_cost, min(product.price) as min_cost')]);

    Log::info('aggregate values: ' . $aggregate_values);

    $business->min_cost = $aggregate_values->min_cost;
    $business->max_cost = $aggregate_values->max_cost;
    $business->update;

}

Используя приведенный выше код, я получаю следующую ошибку:

Свойство [min_cost] не существует в этом экземпляре коллекции.

Насколько я понимаю, мне придется заняться Business:find(), чтобы инициировать модель, а затем обновить ее. Да, есть ли более эффективный способ сделать это, так как это вызовет другой запрос? В противном случае кто-нибудь может сказать мне правильный способ обновления связанной модели?

1 ответ

На самом деле, Query возвращает объект Laravel Collection вместо объекта Product Model. Для того, чтобы получить собственность, вы можете просто использовать $aggregate_values->first()->min_cost

Если это не сработает, вы можете заменить запрос на этот

$result = Product::select('product.business_id', DB::raw('max(product.price) as max_cost, min(product.price) as min_cost'))->join('business', 'product.business_id', '=', 'business.id')->where('business.business_id', '=', $business->id)->groupBy('business.business_id')->firstOrFail();
$business->min_cost = $result->min_cost;
$business->max_cost = $result->max_cost;
$business->save();

Наиболее эффективный способ обновления связанной модели - использование функции Eloquent Relationship.

Другие вопросы по тегам