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 \app\common\model\UserEnhance(); 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函數的具體用法,請移步:(還沒寫)
