首页 > 代码库 > Drupal 7 模块开发 创建自定义表(table) (hook_schema)
Drupal 7 模块开发 创建自定义表(table) (hook_schema)
建立模块请参考 《Drupal 7 模块开发 建立》
如果你要支持中文,文件格式必须保存为 UTF-8,NO BOM
------------------------------
要为自己模块建立一个单独的表(table),需要用到 hook_schema
表名称:myform
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 主键
数组。可以表示一个或多个主关键字
'primary key' => array('id'),
unique keys 唯一键
数组。(‘键名‘ => specification)
foreign keys 外键
数组。(‘外键名‘ => specification)
specification 结构
array (
‘table‘ => ’外表名字‘,
’columns‘ => array(‘本表字段名‘ => ‘对应外表字段名‘)
)'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‘, .....) 可以一个或多个
'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::getFieldTypeMapMySQL size 对应表 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会根据连接不同数据库转换成相应的SQL
MySQL一些常用类型定义
- 自增型(AUTO_INCREMENT)
'id' => array( 'type' => 'serial', 'unsigned' => true, 'not null' => true, 'description' => '自增主键' ),
- 日期型(date, time, datetime, timestamp)
'timestamp' => array( 'type' => 'int', 'not null' => true, 'default' => 0, 'description' => '留言时间', ),
参考:Drupal 模块开发实例之一:表单的基本应用
Drupal 7 模块开发 创建自定义表(table) (hook_schema)