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语句打印出来:

 string(99) "SELECT * FROM `cjd_order` WHERE `user_id` = 8 AND ( `status` IN (4,5,7) OR `refund_status` = 2 )"

2、where里直接写原生:

 //2、直接where写原生
$sql = Db::name('order')
->where('user_id = '.$this->user_id.'and (status in (4,5,7) or refund_status = 2)')
->select(false);

把生成的sql语句打印出来:

 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了

     /**
* 功能:商品券分配情况列表
*
* User: cyf
* Time: 2018/12/15 0015 17:15
*/
public function get_list($whereOr,$where,$query)
{
return $this->with('shop')
->whereOr($whereOr)
->where($where)
->order('update_time desc')
->paginate(10,false,$query);
}

但是如果再加上利用模型的中的字段作为查询条件的话,就复杂了,这时候tp5 的haswhere就派上用场了

     public function get_list($whereOr,$where,$query)
{
return $this
->hasWhere('shop',$whereOr)
->where($where)
->order('update_time desc')
->paginate(10,false,$query);
}

注意:1、此时,with()写不写都行,如果写的话,要写在haswhere()之后,haswhere()一定是最前面

三、find_in_set()的用法

在维护推荐关系过程中,除了要存父级pid之外,一般还会记录一个path字段

还是直接看代码:

 $user_enhance_model = new \app\common\model\UserEnhance();
$list = $user_enhance_model
->where("find_in_set($cate_id,category_ids)")
->field('id,user_id,min_price,max_price,consult_num,title')
->order('user_id asc')
->select();

关于find_in_set函数的具体用法,请移步:(还没写)

ThinkPHP5 高级查询之构建分组条件的更多相关文章

  1. 【2017-03-10】Tsql语句基础、条件,高级查询

    一.语句基础 1.创建数据库:create database 数据库名(不能汉字,不能数字.符号开头) 2.删除数据库:drop database 数据库名 3.选用数据库:use 数据库名 4.创建 ...

  2. python进阶09 MySQL高级查询

    python进阶09 MySQL高级查询 一.筛选条件 # 比较运算符 # 等于:= 不等于:!= 或<> 大于:> 小于:< 大于等于>= 小于等于:<= #空: ...

  3. [转]Laravel 数据库实例教程 —— 使用查询构建器实现对数据库的高级查询

    本文转自:https://laravelacademy.org/post/920.html 上一节我们简单介绍了如何使用查询构建器对数据库进行基本的增删改查操作,这一节我们来探讨如何使用查询构建器实现 ...

  4. SolrNet高级用法(分页、Facet查询、任意分组)

    前言 如果你在系统中用到了Solr的话,那么肯定会碰到从Solr中反推数据的需求,基于数据库数据生产索引后,那么Solr索引的数据相对准确,在电商需求中经常会碰到菜单.导航分类(比如电脑.PC的话会有 ...

  5. 数据库中的T-sql语句 条件修改 高级查询

    1.创建数据库:create database --数据库名,不能中文,不能数字开头,不能符号开头 2.删除数据库:drop database-- 数据库名 use student--使用数据库 3. ...

  6. 【2017-03-10】T-sql基础语句及条件,高级查询

    一.T-sql基础语句 1.创建数据库:create database 数据库名  (不能中文,不能数字开头,不能符号开头) 2.删除数据库:drop database 数据库名 3.选择数据库:us ...

  7. java整合Elasticsearch,实现crud以及高级查询的分页,范围,排序功能,泰文分词器的使用,分组,最大,最小,平均值,以及自动补全功能

    //为index创建mapping,index相当于mysql的数据库,数据库里的表也要给各个字段创建类型,所以index也要给字段事先设置好类型: 使用postMan或者其他工具创建:(此处我使用p ...

  8. jqgrid 表格中筛选条件的多选下拉,树形下拉 ;文本框清除插件;高级查询多条件动态筛选插件[自主开发]

    /** * @@desc 文本框清除按钮,如果isAutoWrap为false当前文本框父级必须是relative定位,boostrap参考input-group * @@author Bear.Ti ...

  9. Django---Django的ORM的一对多操作(外键操作),ORM的多对多操作(关系管理对象),ORM的分组聚合,ORM的F字段查询和Q字段条件查询,Django的事务操作,额外(Django的终端打印SQL语句,脚本调试)

    Django---Django的ORM的一对多操作(外键操作),ORM的多对多操作(关系管理对象),ORM的分组聚合,ORM的F字段查询和Q字段条件查询,Django的事务操作,额外(Django的终 ...

随机推荐

  1. Codeforces 1152E(欧拉路径)

    看样例然后发现只要求一个一笔画即可,用板子. #include <cstdio> #include <cstring> #include <iostream> #i ...

  2. Hdu1015&&寒假作业第二组I题

    题意是A-Z对应1-26,然后给个目标数字和字符串,看看字符串里的某5个字符的组合能不能使v - w^2 + x^3 - y^4 + z^5 = target等式成立,其实多写几个循环也可以达到目的, ...

  3. java.lang.ClassNotFoundException: org.slf4j.LoggerFactory

    缺少slf4j-api.jar和slf4j-log4j12.jar这两个jar包导致的错误.

  4. ASP.NET Core Linux

    环境说明 CentOS / 7.1 (64bit) (Linux操作系统) 3MySQL5.7(网站应用数据库) .NET Core SDK 2.0.0(网站应用环境) Nginx(反向代理服务器) ...

  5. 汉柏杯&&政治生日6月5日&&端午节

    (一)汉柏杯 前不久汉柏杯2019年计算机设计大赛由我校承办,参加了软件应用开发组竞赛.开发了一个基于微信公众号的求职招聘系统,虽然很low但是貌似还是进了国赛,大概八月十号去安徽芜湖参加国赛决赛.据 ...

  6. [USACO15OPEN]回文的路径Palindromic Paths

    [USACO15OPEN]回文的路径Palindromic Paths 题目描述 Farmer John's farm is in the shape of an N \times NN×N grid ...

  7. ES5数组遍历

    reduce() 方法接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终计算为一个值. array.reduce(function(total, currentValue, curren ...

  8. 第一课:K线

    1       K线是根据价格走势中形成的四个价位(开盘价.收盘价.最高价.最低价)绘制而成的.K线是最基本的描述股价涨跌的表现符号(记录某种股票一天的价格变动情况). K线构造的四个价格因素:开盘价 ...

  9. Android里的网格空隙

    在很多移动端或者web端开发中我们会遇到很多网格布局,如果我们使用线性布局来实现一些简单的网格布局就需要使用padding/margin等属性来使其对齐,代码如下: <LinearLayout ...

  10. awk对列求和

    awk 'BEGIN{total=0}{total+=$1}END{print total}' 文件名