Thinkphp6中where条件中字段与字段比较条件的写法


今天进行系统测试的时候突然发现原来写好的效果不正常了,仔细排查了所有代码都没有明显的错误,开始以为代码逻辑有问题,但无论如何排查都不能找到问题所在,于是用终极武器var_dump()一段一段的分区调试了,果不然异常情况找到了,下面是我写的一行代码:

$repaied = Db::name('card_bill')->where('id',$cid)->where('card_bill_money','>','card_reply_money')->find();//判断账单是否还完

这段代码是作用是查找card_bill表中的card_bill_money是否大写card_reply_money,但是这段代码打印出来的语句是:

SELECT * FROM `viooma_card_bill` WHERE id='1' AND `card_bill_money` > 'card_reply_money' LIMIT 1

ThinkPHP解析出来的时候把原来的字段card_reply_money解析成了字符串了,大家仔细看 > 后面的card_reply_money使用了单引号而非`符号,这才明白ThinkPHP将第二个字段解析成字符串了,所以查询ThinkPHP文档,说实在我确实没找到,也不知道是不是搜索条件不正确,于是百度了下,看到有文章讲如果在thinkphp进行字段与字段间比较的话,写法有点区别,一试果然如此,既然我遇到了这个问题,我相信肯定也有好多小伙伴会碰到过这种问题,于是按我搜索的关键词写了这篇文章,希望遇此类问题的朋友们能快速找到并解决你的问题。

下面给大家两个解决方法:


一、正确的写法如下:

$repaied = Db::name('card_bill')->where('id',$cid)->where('card_bill_money',' > card_reply_money')->find();//判断账单是否还完

大家注意看下两段代码where条件分别是:

where('card_bill_money','>','card_reply_money') //这里字段与字段之间用 > 隔开,表示>后面的是字段值而非字段

where('card_bill_money',' > card_reply_money') //这里把 > 与后面的字段写在了一起,即字段与字段之间的比较


二、使用关键词whereColumn(此方法在ThinkPHP6的用户手册中找到)

查询update_time大于create_time的用户数据


Db::table('think_user')
    ->whereColumn('update_time','>','create_time')
    ->select();

生成的SQL语句如下:

SELECT * FROM `think_user` WHERE ( `update_time` > `create_time` )


注:本文转载自唯马网络,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如有侵权行为,请联系我们,我们会及时删除。

评论