需求:
需要用到小括号括起来的内部用OR连接的查询条件
SELECT * FROM table_name WHERE 1 AND (field1 = condition1 OR fileld2 = condition2)
解决:
官方文档翻了半天,想用官方数组方式解决(答案无解)侵入修改源码就算了。
网络上找了找都是老版本的_logic了、_complex了,ThinkPHP6是没有的。
思路:把答案定义为“复杂的查询”,心中豁然开朗!
样例:
// 条件初始化
$where = [
['is_delete_time', '=', 0],
['admin_is_read', '=', 0],
];
$whereOr = [
['business_type', '=', '提醒入库'],
['business_type', '=', '批量出库'],
];
// 1、官方正统:
echo Db::name('Message')->where($where)->where(function ($query) use ($whereOr) { $query->whereOr($whereOr); })->fetchSql()->count();
// 2、投机取巧:
echo Db::name('Message')->where($where)->whereExp('', "`business_type`=? OR `business_type`=?", ['提醒入库', '批量出库'], 'AND')->fetchSql()->count();
// 3、大道至简:
echo Db::name('Message')->where($where)->whereRaw("`business_type`=? OR `business_type`=?", ['提醒入库', '批量出库'], 'AND')->fetchSql()->count();
echo Db::name('Message')->where($where)->whereRaw("`field1`=:condition1 OR `field2`=:condition2", ['condition1'=>'value1', 'condition2'=>'value2'], 'AND')->fetchSql()->count();
// 4、殊途同归
$result = Db::query(" SELECT COUNT(*) AS think_count FROM `tp_message` WHERE `is_delete_time` = 0 AND `admin_is_read` = 0 AND ( `business_type`='提醒入库' OR `business_type`='批量出库' )");
说到底还是语法糖和原生的区别,新项目还是用官方的闭包方式吧,拥抱新的生态慢慢就习惯了!
完。