Laravel 从事件侦听器更新相关模型的最有效方法

Laravel 从事件侦听器更新相关模型的最有效方法,laravel,eloquent,Laravel,Eloquent,我有两种型号业务和产品 我有一个事件,每当产品价格发生变化时就会触发,事件侦听器将计算业务产品的最小和最大聚合值,并将其存储在业务模型中(虽然我知道这可以动态完成,但这是索引和搜索所必需的) 在我的事件侦听器句柄中,我有以下内容: public function handle(ProductModified $event) { $business = $event->product->business; $aggregate_values = Product::jo

我有两种型号
业务
产品

我有一个事件,每当产品价格发生变化时就会触发,事件侦听器将计算业务产品的最小和最大聚合值,并将其存储在业务模型中(虽然我知道这可以动态完成,但这是索引和搜索所必需的)

在我的事件侦听器句柄中,我有以下内容:

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]


我的理解是,我必须做一件事:find()启动模型,然后更新它。是的,是否有更有效的方法来执行此操作,因为这将调用另一个查询?否则,有人能告诉我更新相关模型的正确方法吗?

实际上,查询返回的是Laravel集合对象,而不是产品模型对象。为了获取属性,您只需使用
$aggregate\u values->first()->min\u 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();
更新相关模型最有效的方法是使用雄辩的关系特征