沙滩星空的博客沙滩星空的博客

thinkPHP5表连接方式总结with和join

商品收藏的数据模型内,进行分页查询和数据筛选:

关联方法名这里省略。
正确写法

->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
未经允许不得转载:沙滩星空的博客 » thinkPHP5表连接方式总结with和join

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址