我有三个表:用户
,帐户
和酒店。
用户和帐户与属性连接,许多
关系和帐户和酒店以相同的方式连接。每个用户都有帐户,这些帐户都有酒店。
当我有了Auth::user(),
我如何才能归还所有酒店?
$accounts = Auth::user()->accounts()->get();
有了上述声明,我可以得到所有帐户。我如何归还所有酒店?
我试过什么?
public function index(Request $request)
{
$accounts = Auth::user()->accounts()->get();
$hotels = collect();
foreach ($accounts as $key => $a) {
$h = $a->hotels();
$hotels = $hotels->toBase()->merge($h);
}
dd($hotels);
return view('hotels.index',compact('hotels'));
}
但此代码不返回我可以在blade view文件中使用的hotels集合
在这种情况下,您的关系如下图所示
您要寻找的是之间的关系。
从Laravel留档
“has many through”关系为通过中间关系访问远程关系提供了方便的快捷方式
在您的情况下,您可以在用户模型上定义关系
public function hotels()
{
return $this->hasManyThrough('App\Hotel', 'App\Account');
}
然后得到你的酒店收藏,你可以简单地使用
$hotels = Auth::user()->hotels;
您还可以为hasManyThrough
函数提供额外的参数,以定义每个表上使用的键,上面链接的文档中给出了这方面的重要示例!
相反,如果您有一个关系,如下图所示
这有点棘手(或者至少不太干净)。我能想到的使用最少查询的最佳解决方案是在中使用。
$accounts = Auth::user()->accounts()->with('hotels')->get();
将为您提供一组帐户,每个帐户都有一个子帐户。现在,我们所要做的就是将酒店作为一个独立的集合,这很简单,有一些由Laravel提供的整洁的集合功能。
$hotels = $accounts->flatMap(function($account) {
return $account->hotels;
})->unique(function ($hotel) {
return $hotel->id;
});
这将完成创建酒店集合的工作。在我看来,简单地建立如下所示的新关系会更干净、更高效。
然后使用基本的雄辩方法来执行查询。