Migrations可理解为数据库的版本控制,中文被翻译为迁移
生成迁移
php artisan make:migration create_users_table;//生成指定名称的migration文件,位于database/migrations目录下
//迁移文件名的时间戳用于Laravel判断其顺序
php artisan make:migration create_users_table --create=users;//生成创建并指定表名为users的迁移文件
php artisan make:migration add_votes_to_users_table --table=users;//生成指定表名为users的迁移文件
示例:
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateFlightsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('flights', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->string('airline');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::drop('flights');
}
}
执行迁移
php artisan migrate;
php artisan migrate --force;//强制执行
回滚迁移
php artisan migrate:rollback;
php artisan migrate:rollback --step=5;//回滚指定条数的迁移(一个迁移文件为一条)
php artisan migrate:reset;//回滚所有迁移
php artisan migrate:refresh;//回滚所有迁移后重新执行迁移
php artisan migrate:refresh --seed;//回滚所有迁移后重新执行迁移并填充数据
php artisan migrate:refresh --step=5;//回滚指定条数迁移后重新执行迁移
php artisan migrate:fresh;//从数据库中删除所有表然后执行迁移
php artisan migrate:fresh --seed;//从数据库中删除所有表然后执行迁移并填充数据
创建表
Schema::create('users', function ($table) {
$table->increments('id');
});
if (Schema::hasTable('users')) {
//
}//检查表是否存在
if (Schema::hasColumn('users', 'email')) {
//
}//检查列是否存在
Schema::connection('foo')->create('users', function (Blueprint $table) {
$table->increments('id');
});//指定要使用数据库名
重命名/删除表
Schema::rename($from, $to);
Schema::drop('users');
Schema::dropIfExists('users');
数据列
Schema::table('users', function (Blueprint $table) {
$table->string('email');
});
常见数据列类型:
$table->increments('id');//自增主键类型
$table->string('name', 100);//VARCHAR类型带可选长度参数
$table->enum('level', ['easy', 'hard']);//枚举类型
$table->float('amount', 8, 2);//FLOAT类型带精度和总位数
$table->text('description');//TEXT类型
$table->timestamps();//添加允许为空的created_at和updated_at
$table->decimal('amount', 5, 2);//DECIMAL类型带精度和范围
$table->double('column', 15, 8);//DOUBLE类型列带精度总共15位数字小数点后8位
其他常见选项:
Schema::table('users', function (Blueprint $table) {
$table->string('email')->nullable();
});//允许为NULL
->after('column');//指定为一个列之后
->autoIncrement();//指定为自增主键
->comment('my comment');//指定注释信息
->default($value);//指定列的默认值
->unsigned();//设置INTEGER列为UNSIGNED
修改数据列
前置条件:composer require doctrine/dbal
Schema::table('users', function (Blueprint $table) {
$table->string('name', 50)->change();
});//将name列的尺寸从25增加到50
Schema::table('users', function (Blueprint $table) {
$table->string('name', 50)->nullable()->change();
});//修改该列允许NULL值
重命名列
Schema::table('users', function (Blueprint $table) {
$table->renameColumn('from', 'to');
});
删除数据列
Schema::table('users', function (Blueprint $table) {
$table->dropColumn('votes');
});//删除单个列
Schema::table('users', function (Blueprint $table) {
$table->dropColumn(['votes', 'avatar', 'location']);
});//删除多个列
创建索引
$table->string('email')->unique();//创建时指定列值为唯一索引
$table->unique('email');//创建后指定列值为唯一索引
$table->index(['account_id', 'created_at']);//创建组合索引
$table->index('email', 'unique_email');//指定字段的索引名称
$table->primary('id');//添加主键索引
$table->primary(['id', 'parent_id']);//添加组合索引
$table->unique('email');//添加唯一索引
$table->index('state');//添加普通索引
$table->spatialIndex('location');//添加空间索引
删除索引
$table->dropPrimary('users_id_primary');//删除主键索引
$table->dropUnique('users_email_unique');//删除唯一索引
$table->dropIndex('geo_state_index');//删除普通索引
$table->dropSpatialIndex('geo_location_spatialindex');//删除空间索引
外键约束
Schema::table('posts', function (Blueprint $table) {
$table->integer('user_id')->unsigned();
$table->foreign('user_id')->references('id')->on('users');
});//关联外键
$table->dropForeign('posts_user_id_foreign');//删除外键
Schema::enableForeignKeyConstraints();//启用外键约束
Schema::enableForeignKeyConstraints();//关闭外键约束