作者:老葛,北京亚艾元软件有限责任公司,http://www.yaiyuan.com
Drupal在安装过程中,一般将数据库表的创建,委托给drupal_install_schema()函数;而drupal_install_schema()负责从模块的schema钩子中获取模式定义,转换为具体数据库上的语法,最后创建相应的表结构。我们回顾一下,第二章中,我们创建的模式:
/**
* Implements hook_schema().
*/
function block_morelink_schema() {
$schema['block_morelink'] = array(
'description' => 'Stores more link path.',
'fields' => array(
'module' => array(
'type' => 'varchar',
'length' => 64,
'not null' => TRUE,
'description' => "The block's origin module, from {block}.module.",
),
'delta' => array(
'type' => 'varchar',
'length' => 32,
'not null' => TRUE,
'description' => "The block's unique delta within module, from {block}.delta.",
),
'url' => array(
'type' => 'varchar',
'length' => 255,
'not null' => TRUE,
'description' => "The more link url of a block.",
),
'title' => array(
'type' => 'varchar',
'length' => 255,
'not null' => TRUE,
'description' => "The more link title of a block.",
),
),
'primary key' => array('module', 'delta', 'url', 'title'),
'indexes' => array(
'url' => array('url'),
),
);
return $schema;
}
这个模式定义描述了block_morelink表,它包含4个varchar类型的字段。它还定义了一个联合主键,为url定义了一个普通索引。注意,在字段描述中,引用另一个表中的字段时,需要为其使用花括号。这样模式模块(参看下一节)可以为表的描述构建方便的超链接。
hook_schema为模块定义的每一个数据库表,返回一个带有键的数组。在该数组中,可以使用以下键:
· 'description':一个纯文本字符串,用来描述这个表及其目的。如果这里引用了其它表,那么需要将其放在花括号中。例如,node_revisions表的描述字段包含“为每一个{node},存储每个修订本的标题和正文”。
· 'fields':一个关联数组,用来描述数据库表的列。它的定义仍然是一个关联数组,里面可以使用以下参数:
· 'description': 一个纯文本字符串,用来描述这个字段及其目的。如果这里引用了其它表,那么需要将其放在花括号中。例如,节点表的vid字段的描述包括“总是为这个字段保存最大的(最新的){node_revision}.vid的值”。
· 'type': 通用的数据类型有:'char'、 'varchar'、 'text'、'blob'、'int'、 'float'、 'numeric'、 'serial'。大多数类型会映射到对应数据库引擎上的具体数据库类型。对于自增字段,需要使用'serial'。在MySQL上,这就会转换为'INT auto_increment'。
· 'mysql_type', 'pgsql_type', 'sqlite_type',等等:如果你需要的类型,没有包含在前面所列的内置支持的数据类型列表中,那么你可以为每个后台的数据库指定一个类型。在这种情况下,你就用不到type参数了,但是你需要注意,对于有些数据库,如果你没有单独为其指定可用的类型,那么你的模式在该类型的数据库上将无法运行。可行的解决办法是使用"text"类型作为一个回退。
· 'serialize':一个布尔值,用来指示该字段是否将存储为序列化的字符串。
· 'size':数据的大小,可选值有:'tiny'、'small'、'medium'、'normal'、'big'。这个用来提示该字段可以存储的最大值,以及用来判定将会使用数据库引擎的哪个具体的数据类型;例如,MySQL上,TINYINT vs. INT vs. BIGINT。默认为'normal',表示选择基础类型,比如,在MySQL上,INT、VARCHAR、 BLOB等等。不是所有的大小,都适用于所有的数据类型。对于可用的联合情况,可参看DatabaseSchema::getFieldTypeMap()。
· 'not null':如果为true,那么在这个数据库中,就不允许存在NULL值;默认为false。
· 'default':字段的默认值。这里区别PHP的类型:'', '0', 和 0表示不同含义。如果你为一个'int'类型的字段指定默认值为'0',此时它将不能正常工作,因为这里的'0'是一个字符串,而不是一个整数。
· 'length': 'char'、'varchar'、 'text'字段类型的最大长度。对于其它字段类型,将忽略这个参数。
· 'unsigned':布尔值,用来指示'int'、 'float'、'numeric'类型的字段是否可以包含符号。默认为FALSE。对于其它字段类型,将忽略这个参数。
· 'precision', 'scale':用于'numeric'类型的字段,用来表示数字的精度和保留的小数位数。这两个值都是必须的。对于其它字段类型,将忽略这两个参数。
对于所有的类型,只有'type'是必须的,其它是可选的;对于'numeric'类型,除了'type'是必须的以外,'precision'和'scale'也是必须的。
· 'primary key':一个数组,里面包含一个或多个字段的键名,用来表示数据库表的主键。
· 'unique keys':包含唯一键的关联数组。它里面包含一个或多个字段的键名,用来表示数据库表的唯一键。
· 'foreign keys': 表关联的关联数组。它里面包含被引用表的名字,和一个包含对应列的数组。对应列的定义使用键值对的形式('source_column' => 'referenced_column')。
· 'indexes': 包含索引的关联数组。它里面包含一个或多个字段的键名,用来表示数据库表的一个索引。