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();