logo

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

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

演示 EBT 模块 下载 EBT 模块

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

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

演示 EPT 模块 滚动

滚动
01/10/2025, by Ivan

添加字段

要在 Select 查询中添加字段,请使用 addField() 方法:

$title_field = $query->addField('n', 'title', 'my_title');

上面的代码会指示查询从带有别名「n」的表中选择「title」字段,并将其赋予别名「my_title」。如果没有指定别名,它会自动生成。在绝大多数情况下,生成的别名就是字段名。例如这里将是「title」。如果该别名已存在,别名将变为表名加字段名,例如「n_title」。如果这个别名仍然存在冲突,则会在别名后追加一个计数器,直到找到未使用的别名,例如「n_title_2」。

请注意,如果你自己创建并构建查询但没有指定别名,而默认别名又不可用,那么你的代码几乎可以肯定有问题。然而,如果你在编写 hook_query_alter() 的实现时,你无法确切知道哪些别名已经被使用,因此你始终应当使用生成的别名。

添加多个字段

要选择多个字段,请多次调用 addField(),顺序随意。请注意,在大多数情况下字段的顺序并不重要,如果顺序很重要,那通常说明模块的业务逻辑存在缺陷。

你也可以使用 fields() 方法一次性添加多个字段。

$query->fields('n', ['nid', 'title', 'created', 'uid']);

上述方法等同于调用 addField() 四次,每个字段调用一次。不过,fields() 不支持为字段指定别名。它会返回查询对象本身,因此可以链式调用,而不会返回任何生成的别名。如果你需要知道生成的别名,请使用 addField() 或 getFields() 来访问内部字段的原始结构。

调用 fields() 而不传入字段列表将会生成「SELECT *」查询。

$query->fields('n');

这会导致在查询的字段列表中包含「n.*」。请注意,此时不会创建别名。如果使用 SELECT* 的表中包含的某个字段在另一张表中也被直接引用,那么结果集中可能会发生字段名冲突。在这种情况下,结果集只会包含其中一个字段。因此,不推荐使用 SELECT*。

仅返回一个字段,使用 fetchField

使用 fetchField 方法可以让查询仅返回一个字段,例如下面的代码(一个简单的示例):

$query = $connection->select('node', 'n');
$query->condition('n.nid', 123);
$query->addField('n', 'title');
$result = $query->execute();
return $result->fetchField();