Laravel 如何使用Eloquent连接两个表?

Laravel 如何使用Eloquent连接两个表?,laravel,eloquent,Laravel,Eloquent,我的数据库结构: widgets.id | widgets.site_id sites.id | sites.user_id users.id 小部件属于网站,网站属于用户。用户可以创建许多网站,以及一个网站下的许多小部件 我需要做的是: \Widget::with('site')->where('site.user_id', Auth::id()->get(); 然而,这是行不通的。所以我试了一下: \Widget::join('sites', 'widgets.si

我的数据库结构:

widgets.id | widgets.site_id
sites.id   | sites.user_id
users.id   
小部件属于网站,网站属于用户。用户可以创建许多网站,以及一个网站下的许多小部件

我需要做的是:

\Widget::with('site')->where('site.user_id', Auth::id()->get();
然而,这是行不通的。所以我试了一下:

\Widget::join('sites', 'widgets.site_id', '=', 'sites.id')->where('user_id', Auth::id())->get());
这一个可以工作,但是我无法访问
widget.id
,因为
sites.id
覆盖了
id
属性。(另外,我不喜欢使用流畅的功能,所以我想用纯雄辩的语言来表达。)

基本上,如何执行以下查询:“选择属于此用户的所有小部件。”

因此,我想在result中使用以下内容。(伪)


非常感谢您的帮助。

当您使用
join
时,您需要
选择
仅小部件表:

\Widget::join('sites', 'widgets.site_id', '=', 'sites.id')
  ->where('user_id', Auth::id())
  ->with('site.user')
  ->select('widgets.*')->get();
  // or simply:
  // ->get(['widgets.*']);
也可以在不手动加入表的情况下执行此操作:

$userId = Auth::id();
\Widget::whereHas('site', function ($q) use ($userId) {
    $q->where('user_id', $userId);
})->with('site.user')->get();

我使用
在小部件上加载关系。否则,您将面临n+1查询问题。

您是救世主。我刚才看到你帮了我很多次,所以,再次感谢你!)没问题,我喜欢雄辩。
$userId = Auth::id();
\Widget::whereHas('site', function ($q) use ($userId) {
    $q->where('user_id', $userId);
})->with('site.user')->get();