thinkphp中where()和whereOr()有很多种用法,组合成不同的SQL语句,有些常用的可能都了解,但对于一些特殊的,比如一个字段多种条件、一个条件查询多个字段等。

where()部分

//最简单的实用方法,多条件并列查询,基本形式:['字段名1'=>['SQL运算符','值'],'字段名1'=>['SQL运算符','值'],……]
$where = ['name' => ['like', '%国%'], 'age' => ['>=', 18]];
Db::table('user')
    ->where($where)
    ->find();
//SQL语句
SELECT * FROM `user` WHERE `name` LIKE '%国%' AND `age` >= 18 LIMIT 1

//特殊用法(|和&),多个字段用同一个条件查询,并且用and或or连接

//or(|)的用法
$where = ['name|address' => ['like', '%国%']];
Db::table('user')
    ->where($where)
    ->find();
//SQL语句
SELECT * FROM `user` WHERE ( `name` LIKE '%国%' OR `address` LIKE '%国%' ) LIMIT 1

//and(&)的用法
$where = ['name&address' => ['like', '%国%']];
Db::table('user')
    ->where($where)
    ->find();
//SQL语句
SELECT * FROM `user` WHERE ( `name` LIKE '%国%' AND `address` LIKE '%国%' ) LIMIT 1

//复杂查询,一个字段同时满足多种查询条件
$where = ['name' => [['like', '%国%'],['like', '%天%'],'or']];
Db::table('user')
    ->where($where)
    ->find();
//SQL语句
SELECT * FROM `user` WHERE ( `name` LIKE '%国%' or `name` LIKE '%天%' ) LIMIT 1
//其中如果or不写默认为and连接,或者这里也可以写上and
$where = ['name' => [['like', '%国%'],['like', '%天%'],'and']];
Db::table('user')
    ->where($where)
    ->find();
where = ['name' => [['like', '%国%'],['like', '%天%']]];
Db::table('user')
    ->where($where)
    ->find();
//以上两种方式生成的SQL语句相同
SELECT * FROM `user` WHERE ( `name` LIKE '%国%' AND `name` LIKE '%天%' ) LIMIT 1

whereOr()部分

//最简单的实用方法,多条件or查询,基本形式:['字段名1'=>['SQL运算符','值'],'字段名1'=>['SQL运算符','值'],……]
$where = ['name' => ['like', '%国%'], 'age' => ['>=', 18]];
Db::table('user')
    ->where($where)
    ->find();
//SQL语句
SELECT * FROM `user` WHERE `name` LIKE '%国%' OR `age` >= 18 LIMIT 1

//复杂用法,在whereOr中使用and,并且多个and之间用or连接(TP6写法)
$where = [//第一维代表多个条件
    [//第二维之间用or链接
        //第三维之间用and连接
        ['create_time', '<=', time()],
        ['status', '=', '1']
    ], [
        ['id', '>=', 10],
        ['update_time', '>=', time()],
    ]
];
Db::table('user')
    ->whereOr($where)
    ->find();
//SQL语句
SELECT * FROM `user` WHERE (create_time <= time() and status = 1)  or  (update_time >= time() and id >= 10)

其他用法

//模糊搜索后,按照搜索结果排序,比如:文章模糊搜索标题和内容,搜索结果优先显示标题
$where = ['title|content' => ['like', '%国%']];
Db::table('article')
    ->whereOr($where)
    ->order('titlelike "%国%" desc')
    ->find();