字段
添加字段
要在 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();