ThinkPHP5 高级查询之构建分组条件
一、在tp5中通过where方法如何构建分组条件,
例如:
where user_id=$this->user_id and (status in (4,5,7) or refund_status = 2)
该如何构建?
1、通过闭包查询:
//1、通过闭包查询
$sql = Db::name('order')
->where('user_id',$this->user_id)
->where(function ($query){
$query->where('status','in',[4,5,7])
->whereOr('refund_status',2);
})
->select(false);
把生成的sql语句打印出来:
1 string(99) "SELECT * FROM `cjd_order` WHERE `user_id` = 8 AND ( `status` IN (4,5,7) OR `refund_status` = 2 )"
2、where里直接写原生:
1 //2、直接where写原生
2 $sql = Db::name('order')
3 ->where('user_id = '.$this->user_id.'and (status in (4,5,7) or refund_status = 2)')
4 ->select(false);
把生成的sql语句打印出来:
1 string(99) "SELECT * FROM `cjd_order` WHERE `user_id` = 8 AND ( `status` IN (4,5,7) OR `refund_status` = 2 )"
通过对比,我们发现,两种方法生成的sql语句是一样的,不过第二种方式比较简单粗暴,必要时候还是挺好用的,^><^
也可查看tp5手册高级查询部分:tp5高级查询
二、如何查询模型中的字段作为查询条件
在使用tp5模型中,无论是一对一还是一对多,如果遇到将主表的字段作为查询条件的时候是很普通的,比如直接这样写就OK了
1 /**
2 * 功能:商品券分配情况列表
3 *
4 * User: cyf
5 * Time: 2018/12/15 0015 17:15
6 */
7 public function get_list($whereOr,$where,$query)
8 {
9 return $this->with('shop')
10 ->whereOr($whereOr)
11 ->where($where)
12 ->order('update_time desc')
13 ->paginate(10,false,$query);
14 }
但是如果再加上利用模型的中的字段作为查询条件的话,就复杂了,这时候tp5 的haswhere就派上用场了
1 public function get_list($whereOr,$where,$query)
2 {
3 return $this
4 ->hasWhere('shop',$whereOr)
5 ->where($where)
6 ->order('update_time desc')
7 ->paginate(10,false,$query);
8 }
注意:1、此时,with()写不写都行,如果写的话,要写在haswhere()之后,haswhere()一定是最前面
三、find_in_set()的用法
在维护推荐关系过程中,除了要存父级pid之外,一般还会记录一个path字段
还是直接看代码:
1 $user_enhance_model = new appcommonmodelUserEnhance();
2 $list = $user_enhance_model
3 ->where("find_in_set($cate_id,category_ids)")
4 ->field('id,user_id,min_price,max_price,consult_num,title')
5 ->order('user_id asc')
6 ->select();
关于find_in_set函数的具体用法,请移步:(还没写)