2016-12-25 68 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所有卡。