Laravel 为我们提供了数据库结构操作功能 Migrations (数据库迁移),我们可以通过它创建一张数据库表,改变其中的结构,并在此基础上提供迁移和回滚功能。
但是,我们公司在进行 Laravel 开发的时候没有用到这个功能,先谈谈我们是怎么做的:
直到我发现 Django 和 Cake PHP、Ruby On Rails 也提供类似的功能,我觉得我需要重新认识 Migrations 了。
php artisan migrate:install
在配置好数据库以后,这条命令会在数据库中创建一个名叫 migrations
的表,包括字段:
这张表是 Migrations 的基础,用来标识数据库哪个迁移已经执行,哪个迁移还未执行。
数据库迁移文件是这套系统的重要组成部分,假如需要在现有的系统中加入博客文章功能,我们创建一个数据库迁移文件:
php artisan make:migration paper
然后从 database/migrations 找到刚刚创建的数据库迁移文件,它包含了 up (迁移)和 down (回滚)方法。定义一下 Paper 的 Schema:
public function up()
{
Schema::create('papers', function (Blueprint $table) {
$table->increments('id');
$table->string('title');
$table->text('content');
$table->timestamps();
});
}
public function down()
{
Schema::dropIfExists('papers');
}
详细的 Schema 你可以看中文文档:https://laravel-china.org/docs/5.3/migrations
此刻我们的 Schema 相对于数据库结构更新,我们将它同步到数据库:
php artisan migrate
这时候会根据 Schema 创建一张名叫 papers 的表,另外 Migrations 会在表 migrations
插入一条记录表明这个迁移文件执行过,再次执行 migrate 不会重新执行迁移(即创建 papers 表)。
后来流量越来越大,我们发现需要给 title 字段增加一个索引 ... 那应该怎么办呢?
引入一个 Composer 包,用以判断当前数据库的字段状态。
composer require doctrine/dbal
我们再创建一个数据库迁移文件:
php artisan make:migration paper_title_index
这个数据库迁移文件用于给 papers 表的 title 字段增加索引:
public function up()
{
Schema::table('papers', function ($table) {
$table->string('title')->index()->change();
});
}
public function down()
{
Schema::table('papers', function ($table) {
$table->string('title')->change();
});
}
这时候再执行 php artisan migrate
,papers 表的 title 字段就有了索引。
过了几天,由于数据量较少这个索引没有太大的用处,需要去掉这个索引(你事好多啊) ...
php artisan migrate:rollback --step=1
Rollback (回滚)是数据库版本控制的另一大核心功能,Step 表明了回滚的个数。在这里,我们需要撤销上一个迁移,那么我们设置 Step 为 1,执行过后索引就不存在了。如果不填写 Step,则会回滚上一次执行的所有迁移,它和 Reset 的区别也就在这里。
执行一次 migrate 可以运行多个迁移,所以 migrations
表中有一个 batch 字段,插入的时候为现有最大 batch + 1,用于表明这个迁移是第几次。
那过了一天,发现根本就没有人看你的文章(摔!),想要去掉这个功能 ... 代码可以根据 Git 到指定 Commit,那数据库怎么办?
php artisan reset
Laravel 为我们提供了重置,可以回滚所有迁移。
php artisan status
你可以得到当前的状态信息。
这条命令会回滚所有的迁移(Reset),接着重新执行所有迁移(Migrate)。
通常被用于重置数据库。
使用 Migrations 后,不必再拘泥于一台中心数据库,每位开发人员都可以使用自己机器上的数据库,不再为数据库版本控制而困扰。
结论:Migrations 可以让数据库结构和代码一起进行版本控制。
请问哪里可以看一下数据库操作的例子?简单的表格显示数据弄了一天还没好 = =
https://d.laravel-china.org/docs/5.5/queries
我比较推荐 Laravel China 翻译的文档,这里有对于数据库操作的例子;另外 Eloquent ORM 也是非常推荐学习使用的,用起来非常方便。