然后我们来查询第一名用户,也就是
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 同学的话题又回来了不是。
如果要进行约束预加载,应该这样写。
$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();