2017-07-10 6 views
0

私にはBusinessProductsという2つのモデルがあります。イベントリスナーから関連モデルを更新する最も効率的な方法

私は、製品の価格が変わるたびにイベントが発生します。イベントリスナーは、ビジネス製品の最小値と最大値を計算し、それらをビジネスモデル内に格納します(これは動的に行うことができますが、これは索引付けと検索に必要です)。私のイベントリスナーのハンドルで

私は、次のしている:

Property [min_cost] does not exist on this collection instance.

私の理解では、私がビジネスを行う必要があるでしょうということである。

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; 

} 

コードを使用して、私は次のエラーが表示され、上記:find()を呼び出してモデルを開始し、モデルを更新します。はい、他のクエリを呼び出すので、これを行うより効率的な方法はありますか?さもなければ、誰かが私に関連するモデルを更新する正しい方法を教えてくれるでしょうか?

答えて

0

実際、クエリはProduct ModelオブジェクトではなくLaravel Collectionオブジェクトを返します。プロパティを取得するためには、それは動作しません場合は、単に$aggregate_values->first()->min_cost

を使用することができ、あなたがして、クエリを置き換えることができ、関連するモデルを更新するには、この1

$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(); 

最も効率的な方法は、雄弁関係機能Documentation urlを使用することです

関連する問題