Thinkphp6中where条件中一个表两个字段比较条件的写法
发表于:2023-03-06 22:54:37浏览:1060次
今天有用户反馈勾股dev的有个统计数据有问题,然后仔细排查代码没发现明显的错误,以为代码逻辑有问题,但无论如何排查都不能找到问题所在,后面通过sql语句分解查询,终于知道了是sql语句的问题:ThinkPHP框架,mysql查询条件,一个表里的两个字段比较的问题。
做了下测试,比如查询出手机号就是微信号的用户:
1、正常的sql语句应该是这样的:
SELECT `id`,`name`,`tel`,`weixin` FROM `user` WHERE `tel` = `weixin`
2、在thinkphp框架中测试:
当where
条件是字符串时,肯定是可以的:
Db::name('user')->where('`tel`=`weixin`')->field('id,name,tel,weixin')->select();
字段不加反引号【`】也是可以的:
Db::name('user')->where('tel=weixin')->field('id,name,tel,weixin')->select();
3、当where
条件使用数组时,测试不可以,字段会被当做字符串,比较时转化为了0:
Db::name('user')->where(['tel'=>"`weixin`"])->field('id,name,tel,weixin')->select();
打印出sql是:SELECT id
,name
,tel
,weixin
FROM user
WHERE tel
= 0。
Db::name('user')->where(['tel'=>'`weixin`'])->field('id,name,tel,weixin')->select();
打印出sql是:SELECT id
,name
,tel
,weixin
FROM user
WHERE tel
= 0。
Db::name('user')->where(['tel'=>`weixin`])->field('id,name,tel,weixin')->select();
打印出sql是:SELECT id
,name
,tel
,weixin
FROM user
WHERE tel
= null 。
结论:
使用单引号、双引号时,都会被当做字符串,比较时当做0来查询,不用引号时,当做null来查询,所以只可以使用字符串的查询方式,数组是方式没有查到好的解决办法。
下面是解决方法:
使用关键词whereColumn
(此方法在ThinkPHP6的用户手册中找到)
比如:查询update_time大于create_time的用户数据。
Db::name('think_user')
->whereColumn('update_time','>','create_time')
->select();
生成的SQL语句如下:
SELECT * FROM `think_user` WHERE ( `update_time` > `create_time` )
推荐文章
- ThinkPHP6部署到Apache的详细步骤
- 微信淘宝实现互通?有关部门开始要求即时通信软件解除屏蔽网址链接,公平竞争
- ThinkPHP6使用中间件实现后台登录验证方案
- div设置为height:100%不起作用,无法占满整个屏幕的解决办法
- 国民APP微信内测新功能:朋友圈内容可转发给好友
- 今晚新剧,碧血玄黄7/8集:金锋动,银剑现,道象阴阳变
- EHR系统——电子人力资源管理系统详解
- 支付宝已支持给微信QQ好友转账 微信支付宝互通何时能实现?
- ref, toRef, toRefs,reactive, defineComponent, computed, unref, toRaw, watchEffect, onUpdated 10个VUE3前端API总结
- Unicode 14.0标准版本发布,新增 838 个字符,共计达 144697 个字符