logo

额外区块类型 (EBT) - 全新的布局构建器体验❗

额外区块类型 (EBT) - 样式化、可定制的区块类型:幻灯片、标签页、卡片、手风琴等更多类型。内置背景、DOM Box、JavaScript 插件的设置。立即体验布局构建的未来。

演示 EBT 模块 下载 EBT 模块

❗额外段落类型 (EPT) - 全新的 Paragraphs 体验

额外段落类型 (EPT) - 类似的基于 Paragraph 的模块集合。

演示 EPT 模块 滚动

滚动
01/10/2025, by Ivan

要在动态查询中添加 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);