2017-12-07 9 views
1

두 모델이 있습니다. 하나는 Order이고 다른 하나는 Item입니다. 주문에는 많은 항목이있을 수 있으며 항목에는 단 하나의 주문 만있을 수 있습니다.웅변의 관계로 방법 만들기

내 주문 모델의 내부 있습니다

public function items() { 
    return $this->hasMany('App\Item', 'OrderNumber', 'OrderNumber'); 
} 

을 그리고 여기 내 아이템 모델의 :

function order() { 
    return $this->belongsTo('App\Order'); 
} 

내가 모두의 총을 얻을 수있는 기능을 가지고 싶습니다 주문 항목 예를 들어 $order->items->totalPrice()을 사용하여 전체를 검색 할 수 있기를 원합니다.

행운과 함께 항목 모델에 추가하려고했습니다. 내가 달성하기 위해 노력하고있어 할 수있는 최선의/깨끗한 방법은 무엇

Undefined property: Illuminate\Database\Eloquent\Collection::$totalPrice 

:

public function totalPrice() { 

    $total = 0; 

    foreach($this as $item) { 
     $total += $item->AmountPaid; 
    } 

    return $total; 

} 

여기에 내가지고있어 오류가있어? 더 좋게도, Laravel은 합산을위한 내장 된 방법을 가지고 있습니까?

+0

'$ 순서 -> items'는'hasMany' 관계는 항상 비어 있거나 관련 다수를 포함 할 수있는'Collection'을 반환로드 ...'Item' 모델의'Collection' 인스턴스가 아닌 모델 – lagbox

답변

4

당신은 (이 관계에 대한 동적 속성을 반환하는 것입니다 때문에 Collection 우리가 우리를 돕기 위해 sum 방법을 사용할 수 있습니다) Order에서이 액세스 할 수 있습니다 : 다음

public function totalPrice() 
{ 
    return $this->items->sum('AmountPaid'); 
} 

Order 인스턴스에서 호출 .

$order->totalPrice(); 

당신이가는 경우

수많은 Order 기록을 검색하고 열망 부하에 N + 1을 방지하기 위해 관계를 원하는 것이 합계를 얻기 위해 그들을 통해 회전한다.

$orders = Order::with('items')->....->get(); 
+0

아, 고마워. return this-> items-> sum ('AmountPaid'); 나를 위해 훌륭하게 일한다. – roweneil

2

당신은이 같은 시도 할 수 있습니다 :

public function totalPrice() 
{ 
    $total = 0; 

    if (!empty($this->items)) { 
     foreach($this->items as $item) { 
      $total += $item->AmountPaid; 
     } 
    } 

    return $total; 
} 

아니 가장 우아한 방법으로, 그러나에 찾고 가치가있을 수도 있습니다 : 귀하의 주문 모델에서

$order = Order::with('items')->find(10); 
$total = $order->totalPrice(); 

을, 당신은 작성해야합니다.

+0

이 솔루션에 대해 부적절한 것은 없습니다. 이것은 SQL SUM 수행에 의지하지 않는 한 항목을 합산하는 적절한 방법입니다. DB는 작업을 수행 할 수 있기 때문에 대부분의 경우 SQL이되지만 캐싱 설정에 따라 매우 빠르다. – davidethell