首页 > yii2教程 > yii2数据库使用

yii2数据库查询生成器--where函数用法

where()
 
where() 方法定义了 SQL 语句中的 WHERE 子句。 有三种格式来定义 WHERE 条件:
 
字符串格式,例如:'status=1'
哈希格式,例如: ['status' => 1, 'type' => 2]
操作符格式,例如:['like', 'name', 'test']
 
字符串格式
 
在定义非常简单的查询条件的时候,字符串格式是最合适的。 它看起来和原生 SQL 语句差不多。例如:
$query->where('id=1');

// or use parameter binding to bind dynamic parameter values
$query->where('id=:id', [':id' => $id]);

// raw SQL using MySQL YEAR() function on a date field
$query->where('YEAR(somedate) = 2017');
 
不要直接在条件语句当中嵌入变量,当这些变量来源于终端用户输入的时候, 很容易受到 SQL 注入的攻击。
 
// 不要这样写,除非你非常的确定 $status 是一个整型数值,或经过了处理。
$query->where("status=$status");
当使用参数绑定的时候,调用 params() 或者 addParams() 方法 来分别绑定不同的参数。
$query->where('status=:status')
->addParams([':status' => $status]);

哈希格式

哈希格式适合用来指定多个 AND 串联起来的简单的sql条件。 以数组的形式来书写的,数组的键表示字段的名称,而数组的值则表示 这个字段需要匹配的值。如: 

// ...WHERE (`status` = 10) AND (`type` IS NULL) AND (`id` IN (1, 6, 15))
$query->where([
'status' => 10,
'type' => null,
'id' => [1, 6, 15],
]);

where函数能正确地处理数值当中的空值和数组,遇到空值使用IS NULL,遇到数组使用IN

$userQuery = (new Query())->select('id')->from('user');

// ...WHERE `id` IN (SELECT `id` FROM `user`)
$query->where(['id' => $userQuery]);

 

操作符格式

操作符格式允许你指定类程序风格的任意条件语句,如:

[操作符, 操作数1, 操作数2, ...]

其中每个操作数是字符串格式、哈希格式或者嵌套的操作符格式, 而操作符是如下列表中的一个: 

and: 操作数会被 AND 关键字串联起来。如,['and', 'id=1', 'id=2'] 将会生成 id=1 AND id=2。如果操作数是一个数组,它也会按上述规则转换成 字符串。例如,['and', 'type=1', ['or', 'id=1', 'id=2']] 将会生成 type=1 AND (id=1 OR id=2)。 这个方法不会自动加引号或者转义。

or: 用法和 and 操作符类似

between: 第一个操作数为字段名称,第二个和第三个操作数代表的是这个字段 的取值范围。如,['between', 'id', 1, 10] 将会生成 id BETWEEN 1 AND 10

not between:用法和 between操作符类似

in: 第一个操作数应为字段名称或者 DB 表达式。第二个操作符既可以是一个数组, 也可以是一个 Query 对象。它会转换成IN 条件语句。如果第二个操作数是一个 数组,那么它代表的是字段或 DB 表达式的取值范围。如果第二个操作数是 Query 对象,那么这个子查询的结果集将会作为第一个操作符的字段或者 DB 表达式的取值范围。 如, ['in', 'id', [1, 2, 3]] 将生成 id IN (1, 2, 3)。 该方法将正确地为字段名加引号以及为取值范围转义。in 操作符还支持组合字段,此时, 操作数1应该是一个字段名数组,而操作数2应该是一个数组或者 Query 对象, 代表这些字段的取值范围。

not in: 用法和 in 操作符类似

like: 第一个操作数应为一个字段名称或 DB 表达式, 第二个操作数可以使字符串或数组, 代表第一个操作数需要模糊查询的值。比如,['like', 'title', 'a'] 会生成 titleLIKE '%a%'。 如果范围值是一个数组,那么将会生成用 AND 串联起来的 多个 like 语句。例如,['like', 'title', ['a', '1']] 将会生成 title LIKE '%a%' AND title LIKE '%1%'。 你也可以提供第三个可选的操作数来指定应该如何转义数值当中的特殊字符。 该操作数是一个从需要被转义的特殊字符到转义副本的数组映射。 如果没有提供这个操作数,将会使用默认的转义映射。如果需要禁用转义的功能, 只需要将参数设置为 false 或者传入一个空数组即可。需要注意的是, 当使用转义映射(又或者没有提供第三个操作数的时候),第二个操作数的值的前后 将会被加上百分号。

or like: 用法和 like 操作符类似,区别在于当第二个操作数为数组时, 会使用 OR 来串联多个 LIKE 条件语句。 

not like: 用法和 like 操作符类似,区别在于会使用 NOT LIKE 来生成条件语句。 

or not like: 用法和 not like 操作符类似,区别在于会使用 OR 来串联多个 NOT LIKE 条件语句。

exists: 需要一个操作数,该操作数必须是代表子查询 yii\db\Query 的一个实例, 它将会构建一个 EXISTS (sub-query) 表达式。

not exists: 用法和 exists 操作符类似,它将创建一个 NOT EXISTS (sub-query) 表达式。 

>, <=, 或者其他包含两个操作数的合法 DB 操作符: 第一个操作数必须为字段的名称, 而第二个操作数则应为一个值。例如,['>', 'id', 10] 将会生成 id>10。 

 

附加条件--andWhere,orWhere

使用 andWhere() 或者 orWhere() 在原有条件的基础上 附加额外的条件。多次调用这些方法来分别追加不同的条件。 如,

$status = 10;
$search = 'yii';

$query->where(['status' => $status]);

if (!empty($search)) {
$query->andWhere(['like', 'title', $search]);
}

如果 $search 不为空,将会生成如下 SQL 语句: 

... WHERE (`status` = 10) AND (`title` LIKE '%yii%')

 

过滤条件--filterWhere

当 WHERE 条件来自于用户的输入时,你通常需要忽略用户输入的空值。 例如,在一个可以通过用户名或者邮箱搜索的表单当中,用户名或者邮箱 输入框没有输入任何东西,这种情况下你想要忽略掉对应的搜索条件, 那么你就可以使用 yii\db\Query::filterWhere() 方法来实现这个目的:

// $username  $email 来自于用户的输入
$query->filterWhere([
'username' => $username,
'email' => $email,
]);

yii\db\Query::filterWhere() 和 where() 唯一的不同就在于,前者 将忽略在条件当中的hash format的空值。所以如果 $email 为空而 $username 不为空,生产如下 SQL ...WHERE username=:username。

提示: 当一个值为 null、空数组、空字符串或者一个只包含空白字符时,那么它将被判定为空值。

类似于 [yii\db\Query::andWhere()|andWhere()]] 和 orWhere(), 你可以使用 yii\db\Query::andFilterWhere() 和 yii\db\Query::orFilterWhere() 方法 来追加额外的过滤条件。

此外, yii\db\Query::andFilterCompare()用法

$query->andFilterCompare('name', 'John Doe');
$query->andFilterCompare('rating', '>9');
$query->andFilterCompare('value', '<=100');

//You can also specify operator explicitly:

$query->andFilterCompare('name', 'Doe', 'like');
关闭
感谢您的支持,我会继续努力!
扫码打赏,建议金额1-10元


提醒:打赏金额将直接进入对方账号,无法退款,请您谨慎操作。