2012-11-02 9 views
27

저는 laravel과 eloquent를 처음 접했고 이것이 가능한지 확실하지 않습니다. 하지만 일대 다 관계가있는 2 개의 테이블이 있습니다. 하나는 "위치"이고 다른 하나는 "사용자"입니다. 한 위치에 많은 사용자가있을 수 있습니다.Laravel eloquent 관계를 세는 것

그래서 난 그냥이 할 수있는 모든 사용자와 모든 위치 얻고 싶었다 경우 :

Location::with("users")->get(); 

을하지만 또한 각 위치, 나는이

을하는 시도가 얼마나 많은 사용자 알고 싶어
Location::with("users")->count("users")->get(); 

하지만 작동하지 않았습니다.

foreach(Location::get() as $location) // or foreach(Location::with("users")->get() as $location) 
{ 
    echo $location->users()->count(); 
} 

이이 문제를 해결하고 당신에게 각 위치 별 사용자 수를 제공해야합니다 :

+0

지금까지 무엇을 찾을 수 했는가? 나는 누군가 당신이 이미 한 일을 제안했다는 것을 의미하지 않는다. – hakre

+0

문서를 확인했지만 실제로 아무 것도 찾을 수없는 경우 – Arcade

+0

Location :: with ("users") -> get();'Location :: with ("users") -> count() ; '일할 수도 있습니다. 당신은 그것을 시도 했습니까 (나는 그 문서를 스캔했고, 그 라이브러리를 사용하지 않았습니까?). – hakre

답변

34

열정적 인로드를 사용하면 언급 된 n + 1 문제가 발생하지 않습니다.

$locations = Location::with('users')->get(); 

$locations->users()->count(); 

사용자 수에 관계없이 3 개의 쿼리가 필요합니다.

$locations = Location::all(); 

$locations->users()->count(); 
:

혼란에 사용자의

  • 선택 위치에서
  • 선택 위치 모델 * *에 대한

    • 카운트 쿼리는이 또한 작동한다는 사실에서 발생

      그러나이 경우 각 위치에 대해 한 번 쿼리합니다.

      더 많은 정보를 원하시면 해당 문서를 참조하십시오 http://laravel.com/docs/eloquent#eager-loading

  • +9

    파티에 늦을지라도 이것을 지적하는 것만으로도 n + 1 문제가 발생합니다.foreach에서는'$ location> users-> count()'를 사용할 필요가 있으며 기본적으로 users() 메소드에는 액세스하지 않고 속성에 액세스하거나 매번 쿼리를 수행합니다. – David

    +0

    @ David 감사합니다. 당신은 여전히 ​​n + 1 문제를 보면서 혼란을 해결하는 데 도움을주었습니다. 이 답변을보다 정확하게 업데이트하는 데 도움이됩니다. –

    7

    당신은 여기에 예입니다, 사용자가 위치에 따라 계산 얻기 위해 각각의 위치 기록에 카운트 메소드를 호출 할 필요가있다. 루프에 수표를 추가하여 사용자 수 = 0 인 위치를 무시할 수 있습니다.

    +6

    Location :: get()의 결과만큼 많은 DB 쿼리를 사용합니까? –

    +32

    이것은 좋지 않습니다. [n + 1 쿼리 문제] (http://stackoverflow.com/questions/97197/what-is-the-n1-selects-issue?lq=1) – edi9999

    +0

    이 경우에는 Collection을 사용하는 것이 좋습니다. 왜냐하면 관계 수에 PHP를 사용하기 때문입니다. $ location-> users-> count()' –