解大劦
解大劦
把mobile放在 whereOr里面,也是AND。
1.这么写: $whereOr[] = [['name', 'like', '%thinkphp'],['mobile', 'like', 'thinkphp%']]; Db::name("abstract_logic_testing")->whereOr($whereOr)->select(); $actual = Db::name("abstract_logic_testing")->getLastSql(); 结果是 AND; 2.这么写 $whereOr = [['name', 'like', '%thinkphp'],['mobile', 'like', 'thinkphp%']]; Db::name("abstract_logic_testing")->whereOr($whereOr)->select(); $actual = Db::name("abstract_logic_testing")->getLastSql(); 结果是OR
1中是 $whereOr[],2中是$whereOr;两者差一个中括号。
好,那就回到我最初的问题 ` $where[] = ['mobile', 'like', 'thinkphp%']; $whereOr[] = ['name', 'like', '%thinkphp']; Db::name("abstract_logic_testing")->where($where)->whereOr($whereOr)->select(); ` 这段代码,WhereOr条件就是 你说的写法。你感觉这段代码 是AND还是OR
这段代码在3.0.30之前,都是OR连接;在3.0.31之后都是AND连接。
从我们测试的结果来说,在3.0.30版本之前 ,WhereOr数组跟外部其他Where条件是 Or连接(WhereOr是判断的是其跟外部的关系);3.0.31版本之后,WhereOr判断的是这个数组几个子条件内部的的关系。
嗯。感谢你参与讨论。WhereOr判断内部条件之间的关系,更符合“道理”。但小版本更新,直接改变了逻辑流程,还是非常不合适。我们的业务代码,都要从新测试。
> 你的whereOR里面传入的是数组就是内部条件之间是OR 如果是whereOr('name', 'like', '%name%') 这种就是和之前的查询条件OR逻辑 这么弄,还是非常容易引起开发者混淆的。建议仅保留一种,要么控制内部关系,要么控制外部关系。