我的数据库结构:
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
属性。 (另外,我不喜欢使用Fluent功能,所以想用纯粹的Eloquent来做。)
基本上,如何进行以下查询:"选择属于该用户的所有小部件。"
结果,我想在结果中使用以下内容。 (伪)
{{ $widget->id }} // 1
{{ $widget->site->id }} // 3
{{ $widget->site->user->username }} // Aristona
非常感谢任何帮助。
答案 0 :(得分:2)
使用SELECT
时,您需要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();
我使用with
急切加载小部件上的关系。否则你最终会遇到n + 1个查询问题。