Laravel 提供当两个表有关联关系时,在Model层建立关系后,在使用过程总,用 with 把关联关系的数据获取出来。
Complaint::filter($params)
->with(['activity' => function($query) {
return $query->select(['title']);
}])
->select(['id', 'pay_order_number', 'user_name', 'handle_type', 'created_at'])
->get();
结果:没有获取到 关联数据 activity,返回null。
原因:指定select
方法字段没有包含作为外键的关联with,意思是你要拉取 activity 相关数据,同时需要把 activity_id 字段获取出来,否则就不要指定字段。
Complaint::filter($params)
->with(['activity' => function($query) {
return $query->select(['title']);
}])
->select(['id', 'activity_id', 'pay_order_number', 'user_name', 'handle_type', 'created_at'])
->get();
结果:仍然返回null,你关联上了,怎么还返回null,假如你关联了数据也指定了获取字段。
原因:关联数据指定字段的话,需要把关联数据中的主键id也要加上。
Complaint::filter($params)
->with(['activity' => function($query) {
return $query->select(['id', 'title']);
}])
->select(['id', 'activity_id', 'pay_order_number', 'user_name', 'handle_type', 'created_at'])
->get();
activity_id
Complaint::filter($params)
->with(['activity', 'xxx', 'yyy'])
->select(['id', 'activity_id', 'pay_order_number', 'user_name', 'handle_type', 'created_at'])
->get();
//无欲无求式,指定查询字段
->with(
['activity' => function($query) {
//你可以在这里使用你要对关联体的查询
return $query->select(['id', 'title']);
}]
//这么搞,指定参数
->with(
['activity' => function($query) use ($params){
//也可以指定查询参数,作为关联体的查询
return $query->select(['id', 'title']);
}]
//多搞
->with(
[
'activity' => function($query) use ($params){
//也可以指定查询参数,作为关联体的查询
return $query->select(['id', 'title']);
},
'user' => function($query) use ($params){
return $query->select(['id', 'user_name']);
}
]
遇到使用 with 的坑,就是在这里。
由于目前还没有看源码是如何实现的,只能讲到使用到哪里。