问题
多个条件or时SQL语句的拼接,例如:
$where = [
'name'=> 'aaa'
];
$whereOr = [
'phone' => 12345678999,
'email' => '11@qq.com',
];
$this->
->name('user')
->field('id,name,phone,email')
->where($where)
->whereOr($whereOr)
->select();
这种写法最后生成的语句是这样的
SELECT id,name,phone,email FROM `user` WHERE `name` = 'aaa' or phone = '12345678999' or `email` = '11@qq.com';
很明显这个语句不是所期望的,期望的应该是下面这样的语句,or的条件价格括号包起来作为一个整体
SELECT id,name,phone,email FROM `user` WHERE `name` = 'aaa' or (phone = '12345678999' and `email` = '11@qq.com');
解决
用tp5内置的查询方法,匿名函数即可满足要求
$this->
->name('user')
->field('id,name,phone,email')
->where($where)
->whereOr(function($query) use ($whereOr){
$query->where($whereOr);
})
->select();
生成的语句是
SELECT id,name,phone,email FROM `user` WHERE `name` = 'aaa' or (phone = '12345678999' and `email` = '11@qq.com');
SQL符合要求