2016-12-25 2 views
4

Laravel 문서는 hasManyThrough 선언이 두 수준 "깊은"관계에만 사용될 수 있음을 나타냅니다. 더 복잡한 관계는 어떻습니까? 예를 들어, User은 많은 숫자가 Subject이고, 각 숫자는 Deck이며, 각 숫자는 Card입니다. User에 속한 모든 DeckhasManyThrough 선언을 사용하여 가져 오는 것은 간단하지만 User에 속하는 모든 Card은 무엇인가요?더 깊은 관계에 hasManyThrough 적용

+0

몇 년 전 [나는이 같은 질문을했다] (http://stackoverflow.com/questions/25938081/distant-hasmanythrough). HasManyThrough는 간단히 지름길입니다. 그것이 그대로, 먼 관계를 액세스하기위한 메커니즘이 내장되어 있지 않습니다. – maiorano84

답변

1

의견에 언급 된대로 hasManyThrough은이 특이성 수준을 지원하지 않습니다. 우리는 Cards -> Decks -> Subjects에서거야

//App\User; 

public function cards() 
{ 
    Card::whereHas('decks', function($q){ 
     return $q->whereHas('subjects', function($q){ 
      return $q->where('user_id', $this->id); 
     }); 
    }); 
} 

: 당신이 할 수있는 것들 중 하나는 반대 방향으로가는 쿼리 빌더 인스턴스를 반환합니다. subjects에는 user_id 열이 있어야하며 여기에 래치 할 수 있습니다. 사용자 모델에서 호출

, 그것은 thussly 할 것 :

$user->cards()->get(); 
0

음, 사실 가장 좋은 방법은 카드 테이블에 여분의 열을 넣어 될 것이다 - 당신이 얻을 너무 자주 요구가있는 경우, USER_ID를 사용자의 모든 카드

Laravel은 2 깊이 관계에 대한 Has-Many-Through 관계를 제공합니다. Laravel이 지원하지 않는 관계의 경우 최상의 테이블 관계를 직접 찾아야합니다.

어쨌든, 목적에 따라 다음과 같은 코드 스냅을 사용하여 사용자의 현재 관계 모델로 모든 카드를 가져올 수 있습니다.

가정

  • 사용자

그래서 프로젝트 모델은 다음 코드 것이다 갑판에 hasManyThough 관계가 있습니다

public function decks() 
    { 
     return $this->hasManyThrough('Deck', 'Subject'); 
    } 
  • 데크 시간을 카드에 hasMany 관계

코드로

$deck_with_cards = $user->decks()->with("cards")->get(); 
$cards = []; 
foreach($deck_with_cards AS $deck) { 
    foreach ($deck->cards as $c) { 
    $cards[] = $c->toArray(); 
    } 
} 

지금 $cards$user에 대한 모든 카드를 가지고있다.

관련 문제