首页 > 代码库 > 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::getFieldTypeMap

    MySQL size 对应表
     tinysmallmediumnormalbig
    varchar   VARCHAR 
    char   CHAR 
    textTINYTEXTTINYTEXTMEDIUMTEXTTEXTLONGTEXT
    serialTINYINTSMALLINTMEDIUMINTINTBIGINT
    intTINYINTSMALLINTMEDIUMINTINTBIGINT
    floatFLOATFLOATFLOATFLOATDOUBLE
    numeric   DECIMAL 
    blob   BLOBLONGBLOB


  • not null
    如果 true,这个字段不允许为空(NULL)。默认是 false

  • default
    这个字段默认值。请注意 ‘‘, ‘0‘ 和 0 的区别

  • length
    这个属性只针对 char, varchartext 类型。其他类型将被忽略。

  • unsigned
    布尔值。只表明 int, float,numeric 是否带符号。其他类型将被忽略。默认是false。

  • precision, scale
    只针对 numeric 类型,其他类型将被忽略。这2个数值是必须写的。
    精度(precision)是小数点前后数字的总位数
    小数位(scale)是小数点右边的数。

  • binary
    布尔值。MySQL会让 char, varchartext 类型使用区分大小写的二进制排序。对于其它那些已经默认区分大小写的数据库无效。
    举例说明:
    如果 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)