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

时间:2017-07-10 00:53:36

标签: laravel eloquent

我有两个模型BusinessProducts

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

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

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 个答案:

答案 0 :(得分:0)

实际上,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功能Documentation url