2016-12-25 104 views
4

Laravel文檔似乎表明hasManyThrough聲明只能用於兩個關係「深」的關係。更復雜的關係呢?例如,User有許多個,其中每個都有很多個,其中每個都有很多個Card。使用hasManyThrough聲明獲取屬於User的所有Deck很簡單,但是屬於User的所有Card是什麼?申請hasManyThrough深入關係

+0

[我問過同樣的問題]幾年前(http://stackoverflow.com/questions/25938081/distant-hasmanythrough)。 HasManyThrough只是一個捷徑。就目前而言,沒有內置的訪問遠程關係的機制。 – maiorano84

回答

1

如評論中所述,hasManyThrough不支持此特定級別。一,你可以做的事情就是返回查詢生成器實例會向相反的方向:

//App\User; 

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

我們從Cards -> Decks -> Subjects去。 subjects應該有一個user_id列,然後我們可以鎖定。

當從用戶模式調用時,它會thussly完成:

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

嗯,其實最好的解決方案將會把多餘的列卡表 - user_ID的,如果你有這麼頻繁的需求得到所有用戶卡。

Laravel爲2深度關係提供了多對多關係,因爲這是非常廣泛使用的關係。 對於Laravel不支持的關係,您需要自己找出最佳表格關係。

任何方式,爲了您的目的,您可以使用以下代碼捕捉爲您的當前關係模型抓取用戶的所有卡片。

假設

  • 用戶有hasManyThough關係到甲板,

因此項目模型將有以下代碼:

public function decks() 
    { 
     return $this->hasManyThrough('Deck', 'Subject'); 
    } 
  • 甲板^ h爲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所有卡。