如何使用Eloquent加入两个表?

时间:2014-07-09 11:18:13

标签: 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.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

非常感谢任何帮助。

1 个答案:

答案 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个查询问题。