记如何在预加载中指定查询的字段
记录下今天在进行关联查询的预加载中一直无法指定需要查询的字段原由。
这里使用的代码为 LaraBBs 。
首先我们先查询所有用户以及对应用户的所有话题。
$result = User::with('topics')
->get()
->toArray();
dd($result);
得到如下结果。
然后我们来查询第一名用户,也就是 Summer
同学的信息及其所有话题。
$result = User::with('topics')
->where('name', 'Summer')
->get()
->toArray();
dd($result);
得到如下结果。
此时我们如果只想看话题的 内容
和 标题
。
根据 文档 中介绍。
$result = User::with('topics:body,title')
->where('name', 'Summer')
->get()
->toArray();
dd($result);
得到如下结果。
emmmmm,我的话题内容呢?
仔细看上方文档截图最后一句发现 使用这个方法时,在你想获取的列中应始终有 id 列。
。
哦,原来始终需要加上 id
列,让我们再来一次。
$result = User::with('topics:id,body,title')
->where('name', 'Summer')
->get()
->toArray();
dd($result);
得到如下结果。
emmmmm,为什么还是木有啊。
再让我们通过 debugbar
查看进行了怎样的 sql
语句。
将 sql
语句放入数据库视图管理工具中执行。
没毛病啊,能查出来啊。
好吧,让我们仔细分析一下 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);
得到如下结果。
哦耶,Summer 同学的话题又回来了不是。
ps:
如果要进行约束预加载,应该这样写。
$result = User::with(['topics' => function ($query) {
$query->select('id', 'user_id', 'body', 'title')
->orderBy('updated_at', 'desc');
}])
->where('name', 'Summer')
->get()
->toArray();
dd($result);
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: