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();
更新相关模型最有效的方法是使用雄辩的关系特征