migration之addColumn

addColumn($columnName, $type = null, $options = array())

addColumn(字段名称, 数据类型, 选项[数组形式])

addColumn源代码

    /**
     * Add a table column.
     *
     * Type can be: string, text, integer, float, decimal, datetime, timestamp,
     * time, date, binary, boolean.
     *
     * Valid options can be: limit, default, null, precision or scale.
     *
     * @param string|Column $columnName Column Name
     * @param string $type Column Type
     * @param array $options Column Options
     * @throws \RuntimeException
     * @throws \InvalidArgumentException
     * @return Table
     */
    public function addColumn($columnName, $type = null, $options = array())
    {
        // we need an adapter set to add a column
        if (null === $this->getAdapter()) {
            throw new \RuntimeException('An adapter must be specified to add a column.');
        }

        // create a new column object if only strings were supplied
        if (!$columnName instanceof Column) {
            $column = new Column();
            $column->setName($columnName);
            $column->setType($type);
            $column->setOptions($options); // map options to column methods
        } else {
            $column = $columnName;
        }

        // Delegate to Adapters to check column type
        if (!$this->getAdapter()->isValidColumnType($column)) {
            throw new \InvalidArgumentException(sprintf(
                'An invalid column type "%s" was specified for column "%s".',
                $column->getType(),
                $column->getName()
            ));
        }

        $this->columns[] = $column;
        return $this;
    }

字段名称

这个很明显,不用多说,字符串就可以

数据类型

string->varchar,默认长度255,最大65535,可变长度

char->char,文档没有说,但是分析源码支持,默认长度255,固定长度

text->根据option传入limit的值决定数据类型

                    'longtext'   >= 4294967295,
                    'mediumtext' >= 16777215,
                    'text'       >= 65535,
                    'tinytext'   >= 255,
例: addColumn('post_content', 'text', [ 'limit' => 256])  
那么字段的数据类型则为tinytext;
该方法不在范围内则默认返回text

integer->integer,整数 ,根据option传入limit的值决定数据类型

                'bigint'    >= 18446744073709551615,
                'int'       >= 4294967295,
                'mediumint' >= 16777215,
                'smallint'  >= 65535,
                'tinyint'   >= 255,
其实这里传入的limit不是长度,而是数
例: addColumn('post_int', 'integer', [ 'limit' => 256])  
那么字段的数据类型则为tinyint;
该方法不在范围内则默认返回int,长度为11;
注:其实只有bigint长度20,int长度11,其他没有长度

*biginteger->bigint,整数,长度20

float->float,浮点小数,没有长度

decimal->decimal,可以理解为高度度小数吧,具体百度

datetime->datetime

timestamp->timestamp

time->time

date->date

binary->binary,二进制,固定长度

*varbinary->varbinary,二进制,可变长度

*blob-> 二进制,根据option传入limit的值决定数据类型

              'longblob'   >= 4294967295,
              'mediumblob' >= 16777215,
              'blob'       >= 65535,
              'tinyblob'   >= 255,
例: addColumn('post_blob', 'blob', [ 'limit' => 256])  
那么字段的数据类型则为tinyblob;
该方法不在范围内则默认返回blob

boolean->tinyint,长度1

*uuid->char,长度无效,固定36位

*geometry->geometry

*point->point

*linestring->linestring

*polygon->polygon

*enum->enum

*set->set

*year->year,长度无效,固定为4

*json->json

选项options

	键名             默认值    数据类型   说明
	'limit'      =>  null      integer    长度
	'length'     =>  null      integer    同等于limit
	'default'    =>  null      mixed      默认值 如CURRENT_TIMESTAMP
	'null'       =>  false     boolean    是否可空
	'comment'    =>  无        string     字段注释
	'after'      =>  无        string     在哪个字段之后
	'identity'   =>  false     boolean    是否递增

        decimal专用选项
	'precision'  =>  无        integer    长度
	'scale'      =>  scale     integer    小数长度
	'signed'     =>  true      boolean    是否无符号



	'update'     =>  无        string     字段修改后是否更新CURRENT_TIMESTAMP
	'timezone'   =>  false     boolean
	'properties' =>  array()   array
	'values'     =>  无        array