Drupal 7 8 模块开发 创建自定义表(table) (hook_schema)

要为自己模块建立一个单独的表(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

  1. function my_first_module_schema() {  
  2.   $schema['myform'] = array(  
  3.     'description' => '第一个表单',  
  4.     'fields' => array(  
  5.       'id' => array(  
  6.         'type' => 'serial',  
  7.         'unsigned' => true,  
  8.         'not null' => true,  
  9.         'description' => '自增主键'  
  10.       ),  
  11.       'title' => array(  
  12.         'type' => 'varchar',  
  13.         'length' => 255,  
  14.         'not null' => true,  
  15.         'default' => '',  
  16.         'description' => '标题',  
  17.       ),  
  18.       'fullname' => array(  
  19.         'type' => 'varchar',  
  20.         'length' => 64,  
  21.         'not null' => true,  
  22.         'default' => '',  
  23.         'description' => '姓名',  
  24.       ),  
  25.       'email' => array(  
  26.         'type' => 'varchar',  
  27.         'length' => 255,  
  28.         'not null' => true,  
  29.         'default' => '',  
  30.         'description' => '电子邮件',  
  31.       ),  
  32.       'body' => array(  
  33.         'type' => 'text',  
  34.         'not null' => false,  
  35.         'size' => 'big',  
  36.         'serialize' => true,  
  37.         'description' => '留言内容',  
  38.       ),  
  39.       'timestamp' => array(  
  40.         'type' => 'int',  
  41.         'not null' => true,  
  42.         'default' => 0,  
  43.         'description' => '留言时间',  
  44.       ),  
  45.     ),  
  46.     'indexes' => array(  
  47.       'myform_timestamp' => array('timestamp'),  
  48.     ),  
  49.     'primary key' => array('id'),  
  50.   );  
  51.   return $schema;  
  52. }  

 

$schema 具体用法可以参考 Schema API

  description   说明

字符串。纯文本格式。表(table)的说明

  fields    字段

 数组。说明数据库表的结构。array('fieldname' => specification),具体可以看文章下面的《详解fields》

  primary key   主键

数组。可以表示一个或多个主关键字

 

[php] view plain copy
  1. 'primary key' => array('id'),  

 

 

 

 

  unique keys    唯一键

数组。('键名' => specification)

  foreign keys    外键

数组。('外键名' => specification)

specification 结构

array (
    ‘table' => ’外表名字‘,
    ’columns' => array('本表字段名' => '对应外表字段名')
)

 

[php] view plain copy
  1. 'foreign keys' => array(  
  2.   'node_revision' => array(  
  3.     'table' => 'node_revision',  
  4.     'columns' => array('vid' => 'vid'),  
  5.    ),  
  6.   'node_author' => array(  
  7.     'table' => 'users',  
  8.     'columns' => array('uid' => 'uid'),  
  9.    ),  
  10.  ),  

 

 

 

 

上面代码说明:

  • 外键名是:node_revision 和 node_author

  • node_author 把本表中uid 和 users表中的uid关联起来 

  indexes    索引

数组。('索引名' => specification)。

specification 结构: array('字段名1', '字段名2', .....) 可以一个或多个

 

[php] view plain copy
  1. 'indexes' => array(  
  2.   'myform_timestamp' => array('timestamp'),  
  3. ),  

 

 

 

 

上面代码说明:把 timestamp 做索引,索引名为 myform_timestamp 

  详解 fields  

  • description
    字段说明
     

  • type
    字段类型,通用类型有 'char', 'varchar', 'text', 'blob', 'int', 'float', 'numeric', 'serial',大多数类型都会自动对应到数据某个类型。
    用 serial 来指定为 自增字段,在MySQL会自动解释为 INT auto_increment
     

  • mysql_typepgsql_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
     
    MySQL 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。
     

  • precisionscale
    只针对 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
    1. 'id' => array(  
    2.         'type' => 'serial',  
    3.         'unsigned' => true,  
    4.         'not null' => true,  
    5.         'description' => '自增主键'  
    6.       ),  

     
  • 日期型(date, time, datetime, timestamp)

    [php] view plain copy
    1. 'timestamp' => array(  
    2.         'type' => 'int',  
    3.         'not null' => true,  
    4.         'default' => 0,  
    5.         'description' => '留言时间',  
    6.       ),  

  同时建立多个table  

 

[php] view plain copy
  1. function my_first_module_schema() {  
  2.   $schema['myform1'] = array(  
  3.     // 定义表1  
  4.    );  
  5.   $schema['myform2'] = array(  
  6.     // 定义表2  
  7.    );  
  8.   return $schema;  
  9. }  

 

http://blog.csdn.net/stevenhzhang/article/details/39717811

bijifenlei