码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2014-10-02 10:03:42      阅读:297      评论:0      收藏:0      [点我收藏+]

标签:drupal 7   模块开发   hook_schema   hook_install   hook_uninstall   

建立模块请参考 《Drupal 7 模块开发 建立

如果你要支持中文,文件格式必须保存为 UTF-8,NO BOM

------------------------------

要为自己模块建立一个单独的表(table),需要用到 hook_schema

表名称:myform

bubuko.com,布布扣


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 对应表
      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, 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)

标签:drupal 7   模块开发   hook_schema   hook_install   hook_uninstall   

原文地址:http://blog.csdn.net/stevenhzhang/article/details/39717811

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!