项目中一直没有使用迁移,因为就我一个(中间来了一个,又走了...),嫌麻烦,今天打算用用迁移,看了下文档:
http://laravelacademy.org/post/2965.html
对文档中的字段的一些操作,简单过了一遍,记录下:
/*
表引擎
*/
$table->engine = 'InnoDB';
/*
类类型
*/
// - 数字
$table->bigInteger('id');
$table->integer('id');
$table->mediumInteger('id');
$table->smallInteger('id');
$table->tinyInteger('id');
// -
$table->decimal('balance', 15, 8);
$table->float('balance');
$table->double('balance', 15, 8);
$table->real('balance');
// - 时间
$table->date('created_at');
$table->dateTime('created_at');
$table->timeStamp('created_at');
$table->time('sunrise');
// - 字符串
$table->char('name', 4);
// 等同于 VARCHAR
$table->string('name');
// 等同于 VARCHAR(100)
$table->string('name', 100);
$table->text('description');
$table->mediumText('description');
$table->longText('description');
// 等同于 BLOB
$table->binary('data');
// -
$table->enum('choices', ['foo', 'bar']);
// -
$table->boolean('confirmed');
// - 这3个没见过
$table->json('options'); // 等同于数据库中的 JSON 类型
$table->jsonb('options'); // 等同于数据库中的 JSONB 类型
$table->uuid('id'); // 等同于数据库的UUID
// 扩展,与laravel系统结合,方便操作
// 自增ID,类型为 bigint
$table->bigIncrements('id');
// 自增ID,类型为 int
$table->increments('id');
// 添加一个 INTEGER类型的 taggable_id 列和一个 STRING类型的 taggable_type列
$table->morphs('taggable');
// 和 timestamps() 一样,但允许 NULL 值
$table->nullableTimestamps('created_at');
// 添加一个 'remember_token' 列:VARCHAR(100) NULL
$table->rememberToken();
// 添加 'created_at' 和 'updated_at'
$table->timeStamps();
// 新增一个 'deleted_at' 列,用于 '软删除'
$table->softDeletes();
/*
列修改器
*/
->first(); // 将列置于表第一个列(仅限于MYSQL)
->after('列名'); // 将列置于某一列后(仅限于MYSQL)
->nullable(); // 允许列为NULL
->defalut($value); // 指定列默认值
->unsigned(); // 设置整型列为 UNSIGNED
/*
修改列
需安装 doctrine/dbal,composer require doctrine/dbal
*/
// change() - 修改列
$table->string('name', 30)->nullable()->change();
// renameColumn() - 重命名列
$table->renameColumn('name', 'title');
/*
删除列
需安装 doctrine/dbal,composer require doctrine/dbal
*/
// 删除单个列
$table->dropColumn('name');
// 删除多个列
$table->dropColumn(['name', 'age']);
/*
创建索引
每种索引,都有3种方式:
一个string参数
一个array参数 - 组合索引
2个参数 - 允许自定义索引名
注意:
laravel自动分配的索引名:
表名_列名_索引类型:users_mobile_unique // users表的mobile字段为unique索引
*/
$table->primary('id'); // 主键索引
$table->primary(['first', 'last']); // 混合索引(这个不太清楚)
$table->primary('first', 'first_primary_index']); // 自定义索引名
$table->unique('mobile'); // 唯一索引
$table->index('state'); // 普通索引
/*
删除索引
*/
$table->dropPrimary('索引名')
$table->dropUnique('索引名')
$table->dropIndex('索引名')
/*
外键约束
注意:
laravel自动分配的外键名:
表名_列名_foreign:posts_user_id_foreign // posts表的user_id字段添加foreign
*/
// 添加外键,当前表的user_id,外键关联users表的id列
$table->foreign('user_id')->references('id')->on('users');
// 约束 'on delete' 和 'on update' 时,才关联外键
$table->foreign('user_id')->references('id')->on('users')->onDelete;
// 删除外键
$table->dropForeign('posts_user_id_foreign');
结语(我使用的是MySQL数据库):
纯粹是按照文档写的过了一遍,有几点记录下:
1.里面有 'json' 类型,MySQL5.7支持
2.里面不少类型,可能MySQL没有的(只是变体而已),而且MySQL有的,laravel也并未都实现了。而且有的和MySQL是不一致的,例如:
boolean 类型 --> 源码中其实是 tinyint(1)
float类型,其实使用的是 double 类型
3.源码目录:
vendor/laravel/framework/src/Illuminate/Database/Schema
可以看看
4.可能没有我们原生的那么全,但基本常用的都有了
5.MySQL的列修改器:
'VirtualAs', 'StoredAs', 'Unsigned', 'Charset', 'Collate', 'Nullable', 'Default', 'Increment', 'Comment', 'After', 'First',
首字母小写
6.
$table->uuid() - 添加字段 'char(36)'
$table->ipAddress() - 添加字段 'varchar(45)'
$table->macAddress() - 添加字段 'varchar(17)'
7.安装 laravel-schema-extend 扩展
支持 '表扩展' 和 'int/tinyint/mediumint/smallint/bigint' 的长度
补充:
很多时候我们需要只运行单个文件的迁移,然后laravel并未提供。查看了下源码,是支持迁移某个目录下的所有文件(使用 '--path' 选项)
所以,我们可以在我们项目中,来进行扩展:
1.在 'database/migrations/' 创建 'single/' 目录
2.将我们想单独执行迁移的文件,复制到 'single/' 目录下
3.执行命令:
php artisan migrate --path=/database/migrations/single