You are here

22 字段

admin 的头像
Submitted by admin on 星期五, 2015-06-05 06:38

作者:老葛,北京亚艾元软件有限责任公司,http://www.yaiyuan.com

    为了向选择查询添加一个字段,可以使用addField()方法:

<?php
$title_field $query->addField('n''title''my_title');
?>

    上述代码将会指示查询,从别名为"n"的表中选择字段"title",并为其设定一个别名"my_title"。如果没有指定别名,那么就会自动生成一个。在大多数情况下,自动生成的别名就是字段名字本身。在这个例子中,如果没有指定别名,自动生成的别名将会是"title"。如果该别名已经存在,那么别名就是表名+字段名。在这个例子中,它将会是"n_title"。如果这个别名也存在了,那么就会在这个别名后面追加一个计数器,直到找到一个未使用的别名,比如"n_title_2"

    注意,如果你自己创建并填充查询,并且没有指定别名,而默认的别名又不可用,通常此时你的代码中肯定存在一个bug。然而,如果你正在实现hook_query_alter()钩子,由于你不确定都已经使用了哪些别名,所以你应该总是使用自动生成的别名。

    注意,为了选择多个字段,只需要简单得依次调用addField()多次就可以了。注意,在大多数的情况下,字段之间的顺序并不影响结果;如果它影响了,通常意味着该模块中存在一个漏洞。

    我们也可以使用fields()方法,一次添加多个字段:

<?php
$query->fields('n', array('nid''title''created''uid'));
?>

    上述方法等价于调用四次addField(),一次对应一个字段。不过,fields()中不支持为字段指定别名。并且它返回的是查询对象本身,而不是返回生成的各种别名,此时可以对其继续使用链式方法。如果你需要知道生成的别名,你可以使用addField(),也可以使用getFields()来访问原始的内部字段结构。

    调用fields()方法,而没有列出字段,此时相当于使用了一个"SELECT *"查询。

<?php
$query->fields('n');
?>

    这将会在查询的字段列表中包含一个"n.*"。此时不会自动生成别名。如果使用SELECT *的表包含了一个字段,而这个字段又恰好在另一个表中被指定,此时,在结果集中,就有可能出现字段名字冲突。在这种情况下,结果集中,只会包含一个同名字段。因此,尽量不要使用SELECT *


Drupal版本: