在商品收藏
的数据模型内,进行分页查询和数据筛选:
关联方法名这里省略。
正确写法
->join('user u', 'collect.user_id = u.user_id')
错误写法
->join('user as u', 'collect.user_id = u.user_id')
join:
public function getList($params=[]){
!empty($params) && $this->setWhere($params);
$res = $this
->alias('collect')
->where("collect.is_delete", "=", 0)
->join('user u', 'collect.user_id = u.user_id')
->join('goods g', 'collect.goods_id = g.id')
->field("collect.id, u.nick_name,g.name")
->paginate(15, false, [
'query' => Request::instance()->request()
]);
return $res;
}
private function setWhere($params){
if (isset($params['nick_name']) && !empty($params['nick_name'])) {
$this->where('u.nick_name', 'like', '%' . trim($params['nick_name']) . '%');
}
if (isset($params['goods_name']) && !empty($params['goods_name'])) {
$this->where('g.name', 'like', '%' . trim($params['goods_name']) . '%');
}
// 订单中搜索用户昵称或订单号
// if (isset($query['search']) && !empty($query['search'])) {
// $this->where('order_no|user.nick_name', 'like', '%' . trim($query['search']) . '%');
// }
}
如果不想原字段被关联的同名字段给覆盖掉。可用field方法指定仅显示必要字段。
比如商品收藏关系表,只显示id字段,且不想被关联表的同名id字段给覆盖掉: collect.id
显示全部字段用星号*
:collect.*
with:
默认的with用的是in查询。
with 多表关联时,进行关联表字段条件查询,不符合条件的结果,字段会直接留空。最后是left join。慎用。
public function getList($params=[]){
$filter = [];
$msgFilter = [];
$userFilter= [];
if(!empty($params['status']) && $params['status']>0){
$filter['status'] = $params['status'];
}
if(!empty($params['object_type']) && $params['object_type']>0){
$msgFilter['object_type'] = $params['object_type'];
}
return $this->where($filter)
->with(['msg'=>function($query)use($msgFilter){
$query->where($msgFilter)->field("id,object_type,title");
},'user'=>function($query)use($userFilter){
$query->where($userFilter)->field("user_id,nick_name");
}])
// ->with(['user','msg'])
->field("msg_id,user_id,id,status,create_time")
->paginate(20,false,['query'=>request()->request()]);
}
所有的field字段必须要有关联的外键和主键
ThinkPHP5关联模型查询指定字段 https://blog.csdn.net/y_w_x_k/article/details/103892903
thinkphp 5.1的with和传统的join场景测试 https://www.jianshu.com/p/999cb3cb1223