2017-09-21 8 views
1

내 주문 수량열망 로딩 한 다 대다 관계

class Item extends Eloquent { 
    public function containers() 
    { 
     return $this->belongsToMany('Container', 'items_containers', 'item_id', 'container_id')->withPivot(['quantity']); 
    } 
} 

class Container extends Eloquent { 
    public function items() { 
     return $this->belongsToMany('Item', 'items_containers', 'container_id', 'item_id')->withPivot(['quantity']); 
    } 
} 

그리고 세 번째 모델을 추적하기 위해 여분의 열이있는 피벗 테이블을 통해 연결된 두 가지 모델이 있습니다

class OrderItem extends Eloquent { 
    public function originalItem() 
    { 
     return $this->hasOne('Item', 'id', 'item_id'); 
    } 
    public function container() { 
     return $this->hasOne('Container', 'id', 'container_id'); 
    } 

} 

내가 원하는 것은 OrderItem 모델을 열심히로드 할 때 피벗 테이블에서 특정 데이터를 가져올 수 있기 때문에 item_idcontainer_id이 주문 항목의 내용과 일치하는 수량 만 가져옵니다.

OrderItems::whereOrderId($orderId) 
    ->with(['originalItem', 'container', '???']) 
    ->get(); 

OrderItem에의 관계를 지정하거나 with 그것을에서로드하는 가장 좋은 방법은 무엇입니까?

+0

나는 당신의 구조를 정말로 이해하지 못한다. 오해하면 미안하다. 모델을 참여시키는 훌륭한 방법은 다음과 같습니다. $ orderItem = OrderItems :: find ($ orderId); $ orderItem-> originalItem; $ orderItem-> container; – Christ

+0

with 명령을 사용하는 주요 목적은 데이터를 anglejs 앱으로 반환한다는 것입니다. 하루 종일 원본 항목과 컨테이너를 가져올 수 있지만 items_containers 피벗 테이블에있는 특정 수량 값을 가져와야합니다. – aynber

답변

2

다음 반환 당신이 원하는 :

$orders = \App\OrderItem::select('item_orders.*', 'items_containers.quantity as quantity')->with('item', 'container') 
    ->leftJoin('items_containers', function ($join) { 
     $join->on('items_containers.item_id', 'item_orders.item_id') 
      ->where('items_containers.container_id', \DB::raw('item_orders.container_id')); 
    }) 
    ->get(); 

그런 다음 당신이 쉽게 수량을 얻을 수 있습니다.

$orders->first()->quantity; 

그게 전부입니다.

+0

물론, 속성! 나는 그 사실을 잊어 버린다. 나는 이걸 시험해보고 알려줄거야. – aynber

+0

그것은 나를 거기에서 붙 잡지 않았다. 그러나 그것은 바른 길의 명확히 나를 얻었다. 열쇠의 일부는 자동로드 할 수있어서 json 응답에이를 다시 전달할 수 있으므로'with' 키워드가 사용되었습니다. 알았어. – aynber

+0

. OrderItem 콜렉션의 일부가되도록 quantity가 있어야합니다. –

1

오른쪽 궤도에서 나를 데려 오기위한 Morteza Rajabi의 주요 소품. Items와 Container가 Many-to-Many 관계 인 동안 OrderItem은 Item과 Container와 일대일 관계를 가지므로 첫 번째 키는 특정 관계를 가져오고 있습니다. 특정 관계의 수량을 얻기 위해, 내가 지정하는 속성을 작성했다 :

public function getItemContainerQtyAttribute() { 
    if($this->item_id && $this->container_id) { 
     return $this->depoItem->containers()->where('items_containers.container_id', $this->container_id)->first()->pivot->quantity; 
    } 
    return null; 
} 

ITEM_ID 및 container_id 점검이 진행중인 작업이며, OrderItems에 항상 올바르게 작성되지 않았기 때문에이다, 일부 항목에는 지정된 컨테이너가 없습니다.

다음 단계는 설득력 내 appends 속성을 자동로드를이었다 :

protected $appends = ['item_container_qty']; 

내가 $item = OrderItems::whereOrderId($order_id)->get();를로드 할 때마다 지금, 그것은 자동으로 피벗 수량을로드합니다.

+0

그것은 일을하지만, 효율적이지 않습니다. N 개의 주문에 대해 N + 3 개의 검색어를 만듭니다. –

+0

귀하의 권리, 그리고 jsonSerialize는 그것에 balking입니다. 나는 이것을 좀 더 조정해야 할 것이다. – aynber

+0

왜 조인을 사용하지 않습니까? –