条件 (Conditions)
要在动态查询中添加 WHERE 子句,请使用 condition() 方法:
$query->condition('bundle', 'article', '=');
上面的代码会指示查询筛选结果,只返回属于 article 内容类型的记录。请注意,这里的字段名必须是通过 addField() 或 addExpression() 方法创建的别名。
Condition 参数
condition() 方法接受三个参数:
- $field - 要比较的字段(必填)。
- $value - 用于比较的值(可选,默认 NULL)。
- $operator - 比较运算符(可选,默认 ‘=’)。
支持的运算符
通用的比较运算符 '=', '<>', '<', '<=', '>', '>=' 在所有受支持的数据库类型中都可用。
使用 IN, NOT IN
IN 和 NOT IN 运算符在 $value 中接受一个数组,并将字段值与数组中的值进行比较。
$users = [2,5,17,22];
$query->condition('uid', $users, 'IN');
在这个示例中,查询会返回 uid 等于 2、5、17 或 22 的记录。
使用 BETWEEN 和 NOT BETWEEN
BETWEEN 和 NOT BETWEEN 运算符接受一个包含两个值的数组进行比较。
$query->condition('count', [5,10], 'BETWEEN');
在这个示例中,查询会返回 count 值在 5 到 10 之间的记录。
使用 IS NULL, IS NOT NULL, EXISTS, 和 NOT EXISTS
按照约定,应使用以下方法,而不是通过 condition() 来实现:
$query->isNull($field); $query->isNotNull($field); $query->exists($field); $query->notExists($field);
虽然像 $query->condition($field, NULL, 'IS NOT NULL'); 这样的写法应该也能正常工作,但推荐使用上述方法。
其他运算符
其他运算符,例如 BINARY 或特定数据库系统支持的运算符,可能可用也可能不可用。在编写可能用于不同数据库系统的模块时,请牢记这一点。
使用多个 Conditions
你可以添加多个 condition() 方法以进一步筛选查询。
$query->condition('bundle', 'article', '=');
$query->condition('status', 1, '=');
如果存在多个 condition(),如上例所示,那么所有条件都必须满足,记录才会出现在查询结果中(即条件之间使用 AND 连接)。
提示:要得到仅带 OR 的查询,请使用一个 orConditionGroup。
条件组 Conditions
条件组可以用于在查询条件中创建更复杂的 where 表达式(包括 OR)。有两种条件组类型:
- orConditionGroup - 返回一个用 OR 连接的条件对象
- andConditionGroup - 返回一个用 AND 连接的条件对象
条件组会返回一个对象,然后可以将其作为条件添加到查询中。
// 创建 orConditionGroup
$orGroup = $query->orConditionGroup()
->condition('promoted', 1)
->condition('uid', [2,4,7,22], 'IN');
// 将组添加到查询中。
$query->condition($orGroup);
在这个示例中,promoted 和 uid 的条件会被添加到 WHERE 子句中,并用 OR 组合。这会生成如下的 WHERE:
WHERE (promoted = 1 OR uid IN (2,4,7,22))
在需要时,可以添加多个 orConditionGroup 和 andConditionGroup。条件组可以嵌套,以满足更复杂的 WHERE 子句需求。
下面是一个 WHERE 子句的示例:
WHERE (a = 1 OR b = 1) AND ((c = 1 AND d = 1) OR (e = 1))
该查询条件可以使用条件组写为:
$orGroup1 = $query->orConditionGroup()
->condition('a', 1)
->condition('b', 1);
$andGroup1 = $query->andConditionGroup()
->condition('c', 1)
->condition('d', 1);
$orGroup2 = $query->orConditionGroup()
->condition($andGroup1)
->condition('e', 1);
$query->condition($orGroup1);
$query->condition($orGroup2);