ThinkPHP5 高级查询之构建分组条件

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函数的具体用法,请移步:(还没写)

多学、 多记、 多练、
原文地址:https://www.cnblogs.com/cyfblogs/p/9719585.html