提问者:小点点

查询远程关系


我有三个表:用户帐户酒店。用户和帐户与属性连接,许多关系和帐户和酒店以相同的方式连接。每个用户都有帐户,这些帐户都有酒店。

当我有了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集合


共1个答案

匿名用户

在这种情况下,您的关系如下图所示

您要寻找的是之间的关系。

从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;
});

这将完成创建酒店集合的工作。在我看来,简单地建立如下所示的新关系会更干净、更高效。

然后使用基本的雄辩方法来执行查询。