php根据id查找条件怎么写_thinkphp where()条件查询

今天来给大家讲下查询最常用但也是最复杂的where方法,where方法也属于模型类的连贯操作方法之一,主要用于查询和操作条件的设置。

where方法的用法是ThinkPHP查询语言的精髓,也是ThinkPHP ORM的重要组成部分和亮点所在,可以完成包括普通查询、表达式查询、快捷查询、区间查询、组合查询在内的查询操作。where方法的参数支持字符串和数组,虽然也可以使用对象但并不建议。

字符串条件

使用字符串条件直接查询和操作,例如:

$User =M("User");// 实例化User对象

$User->where('type=1 AND status=1')->select();

最后生成的SQL语句是

SELECT *FROM think_user WHERE type=1AND status=1

如果使用3.1以上版本的话,使用字符串条件的时候,建议配合预处理机制,确保更加安全,例如:

$Model->where("id=%d and username='%s' and

xx='%f'",array($id,$username,$xx))->select();

或者使用:

$Model->where("id=%d and username='%s' and xx='%f'",$id,$username,$xx)->select();

如果$id变量来自用户提交或者URL地址的话,如果传入的是非数字类型,则会强制格式化为数字格式后进行查询操作。

字符串预处理格式类型支持指定数字、字符串等,具体可以参考vsprintf方法的参数说明。

数组条件

数组条件的where用法是ThinkPHP推荐的用法。

普通查询

最简单的数组查询方式如下:

$User =M("User");// 实例化User对象

$map['name']='thinkphp';

$map['status']=1;

// 把查询条件传入查询方法

$User->where($map)->select();

最后生成的SQL语句是

SELECT *FROM think_user WHERE `name`='thinkphp'AND status=1

表达式查询

上面的查询条件仅仅是一个简单的相等判断,可以使用查询表达式支持更多的SQL查询语法,查询表达式的使用格式:

$map['字段1']=array('表达式','查询条件1');

$map['字段2']=array('表达式','查询条件2');

$Model->where($map)->select();// 也支持

表达式不分大小写,支持的查询表达式有下面几种,分别表示的含义是:

表达式

含义

EQ

等于(=)

NEQ

不等于(<>)

GT

大于(>)

EGT

大于等于(>=)

LT

小于(

ELT

小于等于(<=)

LIKE

模糊查询

[NOT] BETWEEN

(不在)区间查询

[NOT] IN

(不在)IN 查询

EXP

表达式查询,支持SQL语法

示例如下:

EQ :等于(=)

例如:

$map['id']=array('eq',100);

和下面的查询等效

$map['id']=100;

表示的查询条件就是 id = 100

NEQ: 不等于(<>)

例如:

$map['id']=array('neq',100);

表示的查询条件就是 id <> 100

GT:大于(>)

例如:

$map['id']=array('gt',100);

表示的查询条件就是 id > 100

EGT:大于等于(>=)

例如:

$map['id']=array('egt',100);

表示的查询条件就是 id >= 100

LT:小于(

例如:

$map['id']=array('lt',100);

表示的查询条件就是 id < 100

ELT: 小于等于(<=)

例如:

$map['id']=array('elt',100);

表示的查询条件就是 id <= 100

[NOT] LIKE: 同sql的LIKE

例如:

$map['name']=array('like','thinkphp%');

查询条件就变成 name like 'thinkphp%'

如果配置了DB_LIKE_FIELDS参数的话,某些字段也会自动进行模糊查询。例如设置了:

'DB_LIKE_FIELDS'=>'title|content'

的话,使用

$map['title']='thinkphp';

查询条件就会变成 name like '%thinkphp%'

支持数组方式,例如

$map['a']=array('like',array('%thinkphp%','%tp'),'OR');

$map['b']=array('notlike',array('%thinkphp%','%tp'),'AND');

生成的查询条件就是:

(a like '%thinkphp%' OR a like '%tp') AND (b not like '%thinkphp%' AND b not like '%tp')

[NOT] BETWEEN :同sql的[not] between, 查询条件支持字符串或者数组,例如:

$map['id']=array('between','1,8');

和下面的等效:

$map['id']=array('between',array('1','8'));

查询条件就变成 id BETWEEN 1 AND 8

[NOT] IN: 同sql的[not] in ,查询条件支持字符串或者数组,例如:

$map['id']=array('not in','1,5,8');

和下面的等效:

$map['id']=array('not in',array('1','5','8'));

查询条件就变成 id NOT IN (1,5, 8)

EXP:表达式,支持更复杂的查询情况

例如:

$map['id']=array('in','1,3,8');

可以改成:

$map['id']=array('exp',' IN (1,3,8) ');

exp查询的条件不会被当成字符串,所以后面的查询条件可以使用任何SQL支持的语法,包括使用函数和字段名称。

查询表达式不仅可用于查询条件,也可以用于数据更新,例如:

$User =M("User");// 实例化User对象

// 要修改的数据对象属性赋值

$data['name']='ThinkPHP';

$data['score']=array('exp','score+1');// 用户的积分加1

$User->where('id=5')->save($data);// 根据条件保存修改的数据

快捷查询

where方法支持快捷查询方式,可以进一步简化查询条件的写法,例如:

一、实现不同字段相同的查询条件

$User =M("User");// 实例化User对象

$map['name|title']='thinkphp';

// 把查询条件传入查询方法

$User->where($map)->select();

查询条件就变成 name= 'thinkphp' OR title = 'thinkphp'

二、实现不同字段不同的查询条件

$User =M("User");// 实例化User对象

$map['status&title']=array('1','thinkphp','_multi'=>true);

// 把查询条件传入查询方法

$User->where($map)->select();

'_multi'=>true必须加在数组的最后,表示当前是多条件匹配,这样查询条件就变成 status= 1 AND title = 'thinkphp' ,查询字段支持更多的,例如:

$map['status&score&title'] =array('1',array('gt','0'),'thinkphp','_multi'=>true);

查询条件就变成 status= 1 AND score >0 AND title = 'thinkphp'

注意:快捷查询方式中“|”和“&”不能同时使用。

区间查询

where方法支持对某个字段的区间查询,例如:

$map['id']=array(array('gt',1),array('lt',10));

得到的查询条件是: (`id` > 1) AND (`id` < 10)

$map['id']=array(array('gt',3),array('lt',10),'or');

得到的查询条件是: (`id` > 3) OR (`id` < 10)

$map['id']=array(array('neq',6),array('gt',3),'and');

得到的查询条件是:(`id` != 6) AND (`id` > 3)

最后一个可以是AND、 OR或者 XOR运算符,如果不写,默认是AND运算。

区间查询的条件可以支持普通查询的所有表达式,也就是说类似LIKE、GT和EXP这样的表达式都可以支持。另外区间查询还可以支持更多的条件,只要是针对一个字段的条件都可以写到一起,例如:

$map['name']=array(array('like','%a%'),array('like','%b%'),array('like','%c%'),'ThinkPHP','or');

最后的查询条件是:

(`name`LIKE '%a%')OR (`name`LIKE '%b%')OR (`name`LIKE '%c%')OR (`name`='ThinkPHP')

组合查询

组合查询用于复杂的查询条件,如果你需要在查询的时候同时偶尔使用字符串却又不希望丢失数组方式的灵活的话,可以考虑使用组合查询。

组合查询的主体还是采用数组方式查询,只是加入了一些特殊的查询支持,包括字符串模式查询(_string)、复合查询(_complex)、请求字符串查询(_query),混合查询中的特殊查询每次查询只能定义一个,由于采用数组的索引方式,索引相同的特殊查询会被覆盖。

一、字符串模式查询(采用_string 作为查询条件)

数组条件还可以和字符串条件混合使用,例如:

$User =M("User");// 实例化User对象

$map['id']=array('neq',1);

$map['name']='ok';

$map['_string']='status=1 AND score>10';

$User->where($map)->select();

最后得到的查询条件就成了:

( `id` != 1 ) AND ( `name` = 'ok' ) AND ( status=1 AND score>10 )

二、请求字符串查询方式

请求字符串查询是一种类似于URL传参的方式,可以支持简单的条件相等判断。

$map['id']=array('gt','100');

$map['_query']='status=1&score=100&_logic=or';

得到的查询条件是:`id`>100 AND (`status` = '1' OR `score` = '100')

三、复合查询

复合查询相当于封装了一个新的查询条件,然后并入原来的查询条件之中,所以可以完成比较复杂的查询条件组装。

例如:

$where['name']=array('like','%thinkphp%');

$where['title']=array('like','%thinkphp%');

$where['_logic']='or';

$map['_complex']=$where;

$map['id']=array('gt',1);

查询条件是

( id > 1) AND ( ( name like '%thinkphp%') OR ( title like '%thinkphp%') )

复合查询使用了_complex作为子查询条件来定义,配合之前的查询方式,可以非常灵活的制定更加复杂的查询条件。

很多查询方式可以相互转换,例如上面的查询条件可以改成:

$where['id']=array('gt',1);

$where['_string']=' (name like "%thinkphp%")  OR ( title like "%thinkphp") ';

最后生成的SQL语句是一致的。

多次调用

3.1.3版本开始,where方法支持多次调用,但字符串条件只能出现一次,例如:

$map['a']=array('gt',1);

$where['b']=1;

$Model->where($map)->where($where)->where('status=1')->select();

多次的数组条件表达式会最终合并,但字符串条件则只支持一次。

这就是微学网-程序员之家为你提供的"thinkphp where()条件查询"希望对你有所帮助.本文来自网络,转载请注明出处:http://www.weixuecn.cn/article/7432.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/366189.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

3分钟简单了解 prototype 和 __proto__

关于prototype 1. 所有的函数都会有一个prototype属性&#xff0c;属性值是一个普通对象&#xff1b; 2. 当我们去new一个构造函数的实例时&#xff0c;构造函数的原型对象(prototype)会被赋值给它实例的[[Prototype]]属性上&#xff1b; 3. prototype可被称为“显式原型”。…

rdlc报表 矩形高固定_固定资产条码管理系统特点分析

固定资产条码管理系统的特点都有什么&#xff1f;固定资产是维持企业稳定健康发展的重要物质保障&#xff0c;若想最大化发挥固定资产的效能作用&#xff0c;满足生产经营管理的需求&#xff0c;提高应对企业内外部经营环境变化的能力&#xff0c;企业管理者就必须及时了解固定…

Spring 4中@ControllerAdvice的改进

在Spring 4的许多新功能中&#xff0c;我发现了ControllerAdvice的改进。 ControllerAdvice是Component的特殊化&#xff0c;用于定义适用于所有RequestMapping方法的 ExceptionHandler&#xff0c; InitBinder和ModelAttribute方法。 在Spring 4之前&#xff0c; ControllerAd…

bzoj 2007 [Noi2010]海拔——最小割转最短路

题目&#xff1a;https://www.lydsy.com/JudgeOnline/problem.php?id2007 一个点的高度一定不是0就是1。答案一定形如一个左上角的连通块全是0的点、一个右下角的连通块全是1的点。 注意从东到西还有从南到北的边也有用&#xff01;因为不一定是一个阶梯形的&#xff0c;还可以…

php 四维数组_PHP 多维数组

PHP - 两维数组两维数组是数组的数组(三维数组是数组的数组的数组)。首先&#xff0c;让我们看看下面的表格&#xff1a;品牌库存销量Volvo3320BMW1715Saab52Land Rover1511我们能够在两维数组中存储上表中的数据&#xff0c;就像这样&#xff1a;$cars array(array("Vol…

Vue于React特性对比(二)

一&#xff0c;关于响应式数据更新方式的实现 1&#xff09;只有在data里面定义的数据才会有响应式更新 vue依赖的defineProperty的数据劫持加上依赖数据&#xff0c;实现数据的响应式更新。可以称之为依赖式的响应。因为依赖所以注定了只会更新与data相关的数据。 2&#xff0…

《黑客攻防技术宝典Web实战篇@第2版》读书笔记1:了解Web应用程序

读书笔记第一部分对应原书的第一章&#xff0c;主要介绍了Web应用程序的发展&#xff0c;功能&#xff0c;安全状况。 Web应用程序的发展历程 早期的万维网仅由Web站点构成&#xff0c;只是包含静态文档的信息库&#xff0c;随后人们发明了Web浏览器用来检索和显示那些文档&am…

电脑入门完全自学手册_3DMAX零基础入门到精通的学习路线和教程

没有美术基础可以学建模吗&#xff1f;毋庸置疑&#xff0c;只要肯学都是可以的&#xff01;那么我们今天来说说零基础学习建模要着重注意什么。最高效最快速的入门学习方式&#xff1a;看知识兔视频课程&#xff0c;跟着知识兔老师操作&#xff0c;听知识兔老师讲解&#xff0…

使用Java RMI时要记住的两件事

这是一篇简短的博客文章&#xff0c;介绍使用Java RMI时应注意的两个常见陷阱。 设置java.rmi.server.hostname 如果您感到陌生&#xff0c;Connection拒绝托管&#xff1a; RMI客户端上的错误消息&#xff0c;并且您确定连接应该正常工作&#xff08;您仔细检查了所有标准配置…

Python-UiAutomator2实现Android自动化测试

本帖转自搜狗测试公众号 【一、前言】 基于Python-UiAutomator2实现Android自动化测试&#xff0c;小编在Android应用的自动化性能测试中进行了实践。本篇将简单介绍python中使用adb、aapt命令的方法以及Python-UiAutomator2使用&#xff0c;后续文章将对环境搭建以及自动化性能…

阅读笔记:ImageNet Classification with Deep Convolutional Neural Networks

概要&#xff1a; 本文中的Alexnet神经网络在LSVRC-2010图像分类比赛中得到了第一名和第五名&#xff0c;将120万高分辨率的图像分到1000不同的类别中&#xff0c;分类结果比以往的神经网络的分类都要好。为了训练更快&#xff0c;使用了非饱和神经元并对卷积操作进行双GPU实现…

vsCode 设置vue 保存自动格式化代码

setting {// vscode默认启用了根据文件类型自动设置tabsize的选项"editor.detectIndentation": false,// 重新设定tabsize"editor.tabSize": 2,// #每次保存的时候自动格式化"editor.formatOnSave": true,// #每次保存的时候将代码按eslint格式进…

您是否敢更改HashMap实现?

如今&#xff0c;有大胆的工程师在为Oracle工作。 昨天尝试确定Heisenbug时&#xff0c;我得出了这个结论。 不足为奇&#xff0c;当我尝试找到解决方案时&#xff0c;该错误似乎消失了。 几个小时后&#xff0c;将问题归结为JDK7更新之间的细微差别&#xff0c;该错误的“ Hei…

php 函数变量的顺序,PHP实现参数的自定义顺序调用 | 剑花烟雨江南

首先我们以添加用户为例来看两个方法&#xff1a;//方法①public function addUser(string $userName, string $userPassword, string $telephone, string $userEmail ){}//方法②public function addUser(array $data){}方法①的优点&#xff1a; 通过方法的定义&#xff0c;…

硬件信息修改大师_零成本学习之单片机硬件开发(1)

从今天开始给大家逐步讲解单片机编程&#xff0c;有兴趣的小伙伴们&#xff0c;可以关注本课程&#xff0c;完全免费本人从事从2004年大学毕业开始从事开发工作&#xff0c;先后做过单片机开发、ucOSII开发、手机开发、android APP开发、PHP开发、微信小程序开发&#xff0c;目…

RotateDrawable

用来对Drawable进行旋转,也是通过setLevel来控制旋转的,最大值也是:10000 相关属性如下&#xff1a; fromDegrees:起始的角度,,对应最低的level值,默认为0toDegrees:结束角度,对应最高的level值,默认360pivotX:设置参照点的x坐标,取值为0~1,默认是50%,即0.5pivotY:设置参照点的…

ionic3 自动创建启动背景splash以及图标icon

在新建的项目文件夹下的 resources下就是我们放置图标以及启动背景图片的位置了。 如果现在我们想生成自己的图片的启动背景以及图片&#xff0c;我们需要把resources下的 icon.png 以及splash.png 替换为我们的图片。 icon 图片最好为1024x1024像素 splash 图片最好为2732x2…

Spring容器的简单实现(IOC原理)

引言&#xff1a;容器是什么&#xff1f;什么是容器&#xff1f;Spring容器又是啥东西&#xff1f;我给Spring容器一个对象名字&#xff0c;为啥能给我创建一个对象呢&#xff1f; 一、容器是装东西的&#xff0c;就像你家的水缸&#xff0c;你吃饭的碗等等。 java中能作为容器…

Java:安排作业按时间间隔运行

最近&#xff0c;我花了一些时间围绕Neo4j版本之间的滚动升级构建了一组测试&#xff0c;作为其中的一部分&#xff0c;我想记录升级发生时的群集状态。 测试的主线程会等待升级完成&#xff0c;因此我想每隔几秒钟登录另一个线程。 Alistair向我指出了ScheduledExecutorServi…

epic怎么添加本地游戏_游戏日报:原神公测无法上架多家安卓渠道;Epic投资布局游戏UGC平台...

// 热点标签/// NOCITCE华为|小米|OPPO|米哈游|腾讯|莉莉丝B站|阅文集团|Epic|万国觉醒|灰烬战线FGO|怪物弹珠|勇者斗恶龙|金币大师阴阳师|和平精英|王者荣耀|三国志战略版1.华为、小米、OPPO等多家安卓渠道的《原神》版主发布公告称&#xff0c;因开发者要求/未与米哈游达成一…