Doctrine DBAL QueryBuilder复制列时如何取反布尔列值
解决方案
Doctrine DBAL的QueryBuilder中,set()方法第二个参数默认会被当做预绑定参数处理,直接传SQL片段字符串的话,会被转义成普通字面量,根本不会执行字段运算,要实现布尔取反直接用表达式构建器的not()方法就行:
$qb->update('table') ->set('col_1', $qb->expr()->not('col_2'));
生成的原生SQL就是UPDATE table SET col_1 = NOT col_2,不管是原生布尔类型,还是你用tinyint存的0/1布尔值,都能正确取反:col_2是1就给col_1赋0,col_2是0就赋1。
顺便提一句,你之前写的$qb->update('table')->set('col_1', 'col_2');其实是不规范的,只是部分版本/驱动下刚好没触发参数绑定才跑通,规范的同列值复制应该显式声明传入的是列名,避免意外bug:
$qb->update('table') ->set('col_1', $qb->expr()->column('col_2'));
内容的提问来源于stack exchange,提问作者Jonas
相关产品推荐
相关产品推荐

