添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
千年单身的稀饭  ·  An unexpected error ...·  2 月前    · 
阳刚的荔枝  ·  C# - ...·  1 年前    · 
玩足球的灯泡  ·  BGR转YUV420SP-CSDN博客·  1 年前    · 
粗眉毛的蚂蚁  ·  电动邦·  1 年前    · 
闷骚的弓箭  ·  几何C上市_话题_新出行·  1 年前    · 
然后我们来查询第一名用户,也就是 Summer 同学的信息及其所有话题。

$result = User::with('topics')
    ->where('name', 'Summer')
    ->get()
    ->toArray();
dd($result);

得到如下结果。
file
此时我们如果只想看话题的 内容 标题
根据 文档 中介绍。
file

$result = User::with('topics:body,title')
    ->where('name', 'Summer')
    ->get()
    ->toArray();
dd($result);

得到如下结果。
file
emmmmm,我的话题内容呢?
仔细看上方文档截图最后一句发现 使用这个方法时,在你想获取的列中应始终有 id 列。
哦,原来始终需要加上 id 列,让我们再来一次。

$result = User::with('topics:id,body,title')
    ->where('name', 'Summer')
    ->get()
    ->toArray();
dd($result);

得到如下结果。
file
emmmmm,为什么还是木有啊。
再让我们通过 debugbar 查看进行了怎样的 sql 语句。
file
sql 语句放入数据库视图管理工具中执行。
file
没毛病啊,能查出来啊。
好吧,让我们仔细分析一下 sql 语句。
所谓的预加载先是通过 select * from 'users' where 'name' = 'Summer' 查出所有用户的信息。
然后通过关联属性将所查出的所有用户 id 取出带入第二个 sql 语句中
select 'id', 'body', 'title' from 'topics' where 'topics'.'user_id' in ('1')
最后要生成我们平时所看到的数据结构应该是将两次查询的结果按照按照两张表的关联进行合并。
在这次的查询中,两张表的唯一关联应该是 users.id topics.user_id 两字段。
所以,虽然我们能通过最后一条 sql 语句查出数据,但是数据中并不包含关联字段 topics.user_id ,则无法产生关联,也就无法进行数据合并。
再通过一开始说的那句话 使用这个方法时,在你想获取的列中应始终有 id 列。 可知,这里的 id 列应该是关联字段列 user_id
知道原因后再让我们试一下。

$result = User::with('topics:user_id,body,title')
    ->where('name', 'Summer')
    ->get()
    ->toArray();
dd($result);

得到如下结果。
file
哦耶,Summer 同学的话题又回来了不是。
如果要进行约束预加载,应该这样写。

$result = User::with(['topics' => function ($query) {
    $query->select('id', 'user_id', 'body', 'title')
        ->orderBy('updated_at', 'desc');
    ->where('name', 'Summer')
    ->get()
    ->toArray();
dd($result);

补充嵌套预加载指定字段的实现方法:

$user = User::with(['posts'=>function($query) {
     $query->select('id','user_id','title')->orderBy('updated_at','desc');
     $query->with(['tags'=>function($query) {
          $query->select('tag');
}])->where('id',1)->get();

没有添加约束的方法:(不知如何指定tags的字段(Tag与Post是多对多关联))

 $user = User::with(['posts:user_id,title','posts.tags'])->where('id',1)->get();