查询条件

优质
小牛编辑
133浏览
2023-12-01

v3.0开始,herosphp 提供了一套全新的设置查询条件的接口:

MysqlModel::where($field, $opt, $value);

参数名称参数类型参数说明
$fieldstring OR function字段名称, 如果传入的是 function 的话,则说明是闭包.
闭包传入的是一组查询条件。
$optstring操作符,如果不传入 $value 的情况下,$opt 的默认值为 "="。
其他可选值为 'IN', 'NIN', 'NOT', 'BETWEEN', 'LIKE','NULL','NNULL'
$valuestring OR array查询条件值

下面给出一些常用的查询 demo

普通的 AND 查询

//where name='aaaa' AND age > 20
$model->where("name", "aaaa")->where("age", ">", 20);

OR 查询

//where name='aaaa' OR age = 20
$model->where("name", "aaaa")->whereOr("age", 20);

模糊查询

//where name like '%aaaa%'
$model->where("name", "LIKE", "%aaaa%");
$model->where

NULL | NNULL 查询

//where name is null
$model->where("name", "NULL");
//where name is not null
$model->where("name", "NNULL");

IN | NIN 查询

//where id in(1,2,3)
$model->where("id", "IN", [1,2,3]);
//where id not in(1,2,3)
$model->where("id", "NIN", [1,2,3]);

BETWEEN 查询

//where age between 20 and 30
$model->where("id", "BETWEEN", [20,30]);

分组查询

//select id, count(mobile) as num from shop group by mobile having num > 10 
$model->fields("id, count(mobile) as num")->group("mobile")->having("num", ">", 10);

闭包查询

闭包查询通常用来解决复杂的组合条件查询,比如先 AND 在 OR 或者 NOT 等各种逻辑组合,还杂糅了优先级(括号)。 例如要实现下面的查询:

select id,username,password from user where id > 10 and (name like '%aaa%' OR sex = 'M') AND (ischeck=0 AND addtime > '2017-06-20 13:30:30');

这种复杂的查询条件显然是不能用简单的查询接口去实现的,这个时候我们就要使用闭包查询了。

$model->where("id", ">", 10)
    ->where(function($model) use($model) {
        $model->where("name", "LIKE", "%aaa%")->whereOr("sex", "M");
    })
    ->where(function($model) use($model) {
        $model->where("ischeck", 0)->where("addtime", ">", "2017-06-20 13:30:30");
    })

连接查询

$model->alias('a')
    ->fields('a.id, a.username, a.password, b.create_by, create_date, b.number')
    ->join('content b', MYSQL_JOIN_RIGHT)
    ->on('a.id = b.id')
    ->find();
  • MYSQL_JOIN_LEFT 左连接(默认)
  • MYSQL_JOIN_RIGHT 右连接
  • MYSQL_JOIN_INNER 内连接