要为自己模块建立一个单独的表(table),需要用到 hook_schema
(当模块激活(enabled),就会建立自动建立表,当卸载的时候会自动删除,这和Drupal 6不同,不需要在 hook_install 调用 drupal_install_schema('tablename'),和 hook_uninstall 调用 drupal_uninstall_schema('myform'))
首先建立一个文件 my_first_module.install,我们需要建立一个如下表
表名称:myform
写入以下代码:
[php] view plain copy
- function my_first_module_schema() {
- $schema['myform'] = array(
- 'description' => '第一个表单',
- 'fields' => array(
- 'id' => array(
- 'type' => 'serial',
- 'unsigned' => true,
- 'not null' => true,
- 'description' => '自增主键'
- ),
- 'title' => array(
- 'type' => 'varchar',
- 'length' => 255,
- 'not null' => true,
- 'default' => '',
- 'description' => '标题',
- ),
- 'fullname' => array(
- 'type' => 'varchar',
- 'length' => 64,
- 'not null' => true,
- 'default' => '',
- 'description' => '姓名',
- ),
- 'email' => array(
- 'type' => 'varchar',
- 'length' => 255,
- 'not null' => true,
- 'default' => '',
- 'description' => '电子邮件',
- ),
- 'body' => array(
- 'type' => 'text',
- 'not null' => false,
- 'size' => 'big',
- 'serialize' => true,
- 'description' => '留言内容',
- ),
- 'timestamp' => array(
- 'type' => 'int',
- 'not null' => true,
- 'default' => 0,
- 'description' => '留言时间',
- ),
- ),
- 'indexes' => array(
- 'myform_timestamp' => array('timestamp'),
- ),
- 'primary key' => array('id'),
- );
- return $schema;
- }
$schema 具体用法可以参考 Schema API
description 说明
字符串。纯文本格式。表(table)的说明
fields 字段
数组。说明数据库表的结构。array('fieldname' => specification),具体可以看文章下面的《详解fields》
primary key 主键
数组。可以表示一个或多个主关键字
[php] view plain copy
- 'primary key' => array('id'),
unique keys 唯一键
数组。('键名' => specification)
foreign keys 外键
数组。('外键名' => specification)
specification 结构
array (
‘table' => ’外表名字‘,
’columns' => array('本表字段名' => '对应外表字段名')
)
[php] view plain copy
- 'foreign keys' => array(
- 'node_revision' => array(
- 'table' => 'node_revision',
- 'columns' => array('vid' => 'vid'),
- ),
- 'node_author' => array(
- 'table' => 'users',
- 'columns' => array('uid' => 'uid'),
- ),
- ),
上面代码说明:
外键名是:node_revision 和 node_author
node_author 把本表中uid 和 users表中的uid关联起来
indexes 索引
数组。('索引名' => specification)。
specification 结构: array('字段名1', '字段名2', .....) 可以一个或多个
[php] view plain copy
- 'indexes' => array(
- 'myform_timestamp' => array('timestamp'),
- ),
上面代码说明:把 timestamp 做索引,索引名为 myform_timestamp
详解 fields
description
字段说明
type
字段类型,通用类型有 'char', 'varchar', 'text', 'blob', 'int', 'float', 'numeric', 'serial',大多数类型都会自动对应到数据某个类型。
用 serial 来指定为 自增字段,在MySQL会自动解释为 INT auto_increment
mysql_type, pgsql_type,sqlite_type, 等
如果你要用一个非官方支持的数据类型,你可以为每个每个数据库来指定一个类型。在这种情况下,你可以不用类型参数,但是碰到没有指定类型数据库,就会出错。一个可鞥解决方法就是,在type里使用text作为后备。
譬如:type没有MySQL里的date和datetime类型。你可以在这里定义 'mysql_type' => 'DATE', 'mysql_type' => 'DATETIME' 如果你只这么些,当Drupal运行在sqlite上时,这里就会出错。这就需要type先写int
serialize
布尔值,表示该字段是否会被存储为一个序列化的字符串
- size
数据的尺寸有:tiny, small,medium,normal,big. 默认是normal。
MySQL对应的表参考:DatabaseSchema_mysql::getFieldTypeMap
tiny | small | medium | normal | big | |
---|---|---|---|---|---|
varchar | VARCHAR | ||||
char | CHAR | ||||
text | TINYTEXT | TINYTEXT | MEDIUMTEXT | TEXT | LONGTEXT |
serial | TINYINT | SMALLINT | MEDIUMINT | INT | BIGINT |
int | TINYINT | SMALLINT | MEDIUMINT | INT | BIGINT |
float | FLOAT | FLOAT | FLOAT | FLOAT | DOUBLE |
numeric | DECIMAL | ||||
blob | BLOB | LONGBLOB |
not null
如果 true,这个字段不允许为空(NULL)。默认是 false
default
这个字段默认值。请注意 '', '0‘ 和 0 的区别
length
这个属性只针对 char, varchar 或text 类型。其他类型将被忽略。
unsigned
布尔值。只表明 int, float,numeric 是否带符号。其他类型将被忽略。默认是false。
precision, scale
只针对 numeric 类型,其他类型将被忽略。这2个数值是必须写的。
精度(precision)是小数点前后数字的总位数
小数位(scale)是小数点右边的数。
binary
布尔值。MySQL会让 char, varchar 或 text 类型使用区分大小写的二进制排序。对于其它那些已经默认区分大小写的数据库无效。
举例说明:
如果 binary = true,则 a 和 A 的排序就按照 ASCII 代码排序,A 在 a 的前面。
如果 binarry = false,则 a 就在 A 的前面进行排序。
>>>>> 更多数据类型的定义,可以参考:Data types Drupal会根据连接不同数据库转换成相应类型
MySQL一些常用类型定义
- 自增型(AUTO_INCREMENT)
[php] view plain copy - 'id' => array(
- 'type' => 'serial',
- 'unsigned' => true,
- 'not null' => true,
- 'description' => '自增主键'
- ),
- 日期型(date, time, datetime, timestamp)
[php] view plain copy - 'timestamp' => array(
- 'type' => 'int',
- 'not null' => true,
- 'default' => 0,
- 'description' => '留言时间',
- ),
同时建立多个table
[php] view plain copy
- function my_first_module_schema() {
- $schema['myform1'] = array(
- // 定义表1
- );
- $schema['myform2'] = array(
- // 定义表2
- );
- return $schema;
- }
http://blog.csdn.net/stevenhzhang/article/details/39717811