Самый эффективный способ обновить связанную модель из прослушивателя событий
У меня две модели 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.