2014-08-27 3 views
1

where Eloquent ORM을 기반으로 관련 객체를 찾는 올바른 방법은 무엇입니까?Laravel Eloquent ORM 관련 객체 찾기

예를 들어 Store 개체와 관련된 특정 Product 개체를 찾고 싶습니다.

$store = Store::where('hash', Input::get('s'))->first(); 
$product = $store->products->where('ext_id', 2)->get(); 

그러나, 나는 where 알 수없는 방법입니다 오류를 받고 있어요 : 나는 같은 것을 할 수 있다고 생각. 대신 어디 find를 사용의 경우, 해당 제대로 작동합니다

$product = $store->products->find(1); 

가 왜 where 이런 식으로 사용할 수 없습니다?

+0

이 기회에 어디를 사용하지 못할하지만 당신은 $ 저장 -> 제품() 할 경우 ->를 ('EXT_ID', 2) 여기서 -> (수), 그 작동합니다.()를 사용하면 다시 쿼리 할 수 ​​있습니다. 그 이유는 $ store-> products가 컬렉션이기 때문입니다. –

+0

하지만 추가 쿼리가 실행됩니까? 따라서 $ store-> products()는 저장소와 관련된 모든 제품을 선택하는 쿼리를 실행 한 다음 -> get()은 ext_id = 2 인 저장소와 관련된 모든 제품을 선택하기 위해 쿼리를 다시 실행합니다. 그것은 첫 번째 쿼리가 완전히 불필요한 것 같지 않아? – flyingL123

+0

네, DB :: getQueryLog()의 출력에 따라 2 개의 쿼리를 실행하는 것처럼 보입니다. 첫 번째 것은 부적절한 것처럼 보입니다. 이것을 달성하는 더 좋은 방법이 있어야합니다. – flyingL123

답변

1
$product = $store 
    ->products() 
    ->where('ext_id', 2)->get(); 

이 것 하지 실행이 쿼리.

$store->products() // relation object you can query 
$store->products // already fetched related collection/model (depending on relation type) 

은 또한 당신이 열망로드를 사용할 수 있습니다 :

의 차이는 이것이다를 통해, 즉 액세스 할 수

$store = Store::where('hash', Input::get('s')) 
    ->with(['products' => function ($q) { 
     $q->where('ext_id', 2); 
    }])->first(); 

이 가게에서만 ext_id = 2 제품을로드 $store->products


이제 다양한 방법이 있습니다. find 관련 :

$store->products()->find(1); // runs select ... where id=1 
$store->products->find(1); // gets model with id 1 from the collection