laravel迁移文件的命令详解
Laravel鼓励敏捷、迭代的开发方式,我们没指望在第一次就获得所有正确的。
我们对于自己编写代码,可以通过迁移文件,不断的重复去测试.
对于工作,我们开发一个完整的项目,是需要我们每个人相互配合,就好比用svn,git版本控制工具来存储应用程序的源代码文件,使我们能够撤消错误和追踪开发过程中的改变。
但应用程序更改时,存在我们不能单独使用版本控制进行有效管理的区域。在我们如果使用laravel框架开发项目,这个过程中,Laravel应用程序的数据库架构不断演变:如我们在这里添加了一个表,在那里重命名列,删除索引等等,然后出现错误我们可以直接找到哪里出的错,是谁操作的,便于直接解决问题和团队开发.
当你需要一个复杂的方法来跟踪您的数据库架构更改,通常有几种方法:
1.当您在开发团队内工作时,每人都需要知道关于任何架构的更改。
2.当你在生产服务器上部署时,您需要有稳健的方式来升级您的数据库架构。
3.如果您在多台机器上工作,你需要保持所有数据库架构的同步。
如果没有严格的约定和纪律让应用程序开发者遵循,保持数据库架构与应用程序代码同步历来是一个非常麻烦的工作。开发者(或数据库管理员) 进行所需的架构更改。但是,如果应用程序代码回滚到以前的版本,但是很难撤消数据库架构更改,照成数据库版本信息与应用程序代码版本信息不一致。
迁移就是帮助你进化你的代码数据,它不需要你在每次改变的时候delete或者alert数据库。没有删除和重建就意味着你不会在每次改变的时候丢失数据。当你执行迁移时唯一的改变就是将数据库架构从一个版本移到另一个版本,不管是向前还是向后移,相对于svn这样的。
Laravel迁移给你提供了一种在迭代方式中修改数据库架构的手段,它不需要你用SQL操作,而是直接使用封装好的类。Laravel架构生成器允许我们快速创建数据库表和插入列或索引。它使用清洁和富有表现力的语法来操作数据库。你也许为认为Laravel迁移就是数据库的版本控制。
通过定义一个更高级别的接口来创建和维护数据库架构,你可以用与数据库无关的方式定义它。通过使用 PHP 来创建表,定义列和索引,写一次架构并将其应用到任何所支持的数据库后端。
以上参考Database Migration using Laravel
和自己的理解.
laravel 迁移文件基础
laravel迁移文件是定义在laravel框架项目根目录下database/migrations下,在这里可以进行表的创建,列的添加和删除,版本的回退功能,直接用命令去操作,把迁移文件直接保存到目录中方便操作,就好比把php代码直接保存.但是在laravel中的迁移命令都是依靠Artisan工具去执行的.
laravel迁移文件的生成
一个非常见简单的命令,但是我们需要使用laravel的artisan工具,同样的也需要配置好我们的php环境,能够在命令行中去执行,首先下面的是创建表的迁移文件 php artian make:migration create_table_goods --create=goods
这个命令呢是创建一个叫做goods表的迁移文件,在命令行中去执行,成功之后,来到database/migration目录中:
那么在up方法中可以执行添加列的语句如:
public function up()
{
Schema::create('goods', function (Blueprint $table) {
$table->increments('id');
$table->string('email');//添加email字段
$tbale->integer('mobile');//添加moble字段
$table->timestamps();
});
}
那么怎么生成呢 php artisan migrate //执行所有的迁移文件的命令
在项目根目录执行这个命令,成功,去查看自己的数据库,多出一个goods表
假如我做项目,做到一半发现这个表中,缺少一个那么的字段,那怎么办呢,手动去数据库中添加么,不用的?我们还可以用迁移文件去完成 php artisan make:migration add_name_to_goods --table=goods
在命令行中去执行成功之后来到迁移文件目录下
public function up()
{
Schema::table('goods', function (Blueprint $table) {
$table->string('name');//添加name字段
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('goods', function (Blueprint $table) {
$table->dropColumn('name');//删除字段以便于后期修改错误一定要写
});
再次执行迁移文件,发现goods表中多出一个name字段,说明我们添加成功 那么我们在看一下artisan其他的命令
migrate:install 在内部,Laravel使用特殊的表来跟踪哪些迁移已经运行。若要创建此表,只需要用artisan命令行工具: php artisan migrate:install migrate 你将会运行migrate任务频繁的更新你的数据库,以支持你添加到应用程序中的最新的表和列。最基 本的形式,它只会对那些所有没有被运行过的迁移运行up()方法。 migrate:rollback 在写迁移时偶尔也会犯错误。如果你已经运行了迁移,那么你不能只是编辑迁移和再次运行迁移: Laravel假定它已经运行了迁移,那么当你再次运行artisan migrate,不会做任何事情。你必须使 用artisan migrate:rollback回滚迁移,然后编辑迁移,再运行artisan migrate去运行正确的版本。 migrate:reset 回滚所有的迁移(会删掉所有表和数据) migrate:refresh artisan migrate:refresh任务将删除数据库、 重新创建它并将加载当前架构。这是一个方便快方 式去运行重置并随后重新运行所有迁移。 migrate:make artisan migrate:make命令告诉 Laravel 来生成一个迁移文件骨架 (这是实际上是一个 PHP 文件) ,存放到app/database/migrations文件夹中。然后,您可以编辑此文件来充实您的表/索 引定义。然后,artisan migrate命令运行时,artisan会查询此文件来生成 SQL DDL 的实际代码。 php artisan migrate --force: 强制执行最新的迁移文件
==================================分割线==========================================
Laravel 实践之路 数据库迁移与数据填充
数据库迁移实际上就是对数据库库表的结构变化做版本控制,之前对数据库库表结构做修改的方式比较原始,比如说对某张库表新增了一个字段,都是直接在库表中执行alter
table xxx add ..
的方式直接修改,但是这么做有些弊端,比如在开发阶段,你自己的库表修改了,还要把这句sql
语句传给别人再执行一遍,这在多人协同开发时不是一种好的方式.那有没有一种方式能让我们对数据库
库表的修改做一些简单的版本控制,同时能让其他人很方便的同步我们对数据库的修改呢? 答案是我们可以使用Laravel
内置的Migrations
.
对数据库的管理包括哪些部分?
其实Laravel
对数据库的版本管理主要包括两部门: 数据库结构的管理 和数据的管理.
-
数据库结构的管理: 主要是对数据库结构进行管理,比如新增了一张表,某张表增加了一个字段等等.
-
数据的管理: 这个主要是管理表中的数据,生成一些填充数据,解决我们开发调试时没有测试数据的问题.
数据库结构管理
要记录下我们对数据库结构所做的更改,我们可以使用Laravel
内置 Migrations
.
下面我们就走个小例子,看看如果要在数据库中新增一个库表具体该怎么做:
1. 创建一个数据库
Laravel
要和我们的数据库连接,首先要有个对应的数据库,你可以在PHPMyAdmin
或者navicat
for mysql
等管理工具新建一张表:
CREATE DATABASE `laravel5`;
2. 配置数据库的连接信息
我们要使用Laravel
管理数据库,第一步当然是要能连接上数据库,数据库的连接配置信息是放在根目录下的.env
文件中,这里我连接的是本地的数据库:
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel5
DB_USERNAME=root
DB_PASSWORD=123456
3. 安装Laravel
的Migrations
如果我们是第一次使用Migrations
,那就要先执行migrate:install
命令来支持数据库的迁移,进入到项目的根目录,执行安装命令:
php artisan migrate:install
这句话执行了以后,Laravel
会在数据库新建一张migrations
表,用这张表来记录我们每次对数据库做的更改:
4. 创建迁移文件
以上三步是我们在首次使用Migrations
是需要做的,相当于初始化工作,以后每次的更改只需要做下面的工作,好,我们接着往下走.我们的目标是创建一张表,比如说就创建一张商品表goods
,首先我们用artisan
命令来创建一个对应的迁移文件:
php artisan make:migration create_goods_table --create=goods
执行信息如下:
Created Migration: 2017_03_05_214805_create_goods_table
这句话解释一下, make:migration
是迁移命令,create_goods_table
是迁移文件的文件名,--create=goods
是该命令携带的参数,意思是创建一张表,并且表名是goods
,这句话执行完毕以后,
我们可以在database\migrations目录下看到多个一个文件:
5. 编辑迁移文件:
我们首先看一下这个文件的结构,
<?php
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateGoodsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('goods', function (Blueprint $table) {
$table->increments('id');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::drop('goods');
}
}
解释一下这个文件:
该文件包括两个函数,up
和down
,up
方法是当执行迁移动作时要执行的方法,down
方法是在进行数据库回滚的时候执行的方法,因此up
和down
是一对反方法
,up
要创建一张表,down
就是要删除一张表,同理,当up
中是新增一个字段时,down
方法就是删除一个字段了.
我们再来看一下up
方法中的内容
Schema::create('goods', function (Blueprint $table) {..}
这里调用Schema
操作表的方法来创建表,第二个参数是一个闭包,$table
可以用来定义数据库表的结构:
$table->increments('id');
创建一个自增长的字段,字段名默认叫id
,当然你也可以改成其他名字.
$table->timestamps();
这里会在表中创建created_at
和 updated_at
字段.
我们所需要的当然不止这么简单,下面我们就增加一些我们需要的字段:
public function up()
{
Schema::create('goods', function (Blueprint $table) {
$table->increments('id');
$table->integer('goods_sn'); //商品货号
$table->string('goods_name');//商品名
$table->decimal('prize', 10, 2); //价格
$table->timestamps();
});
}
up
方法中新增了三个字段,关于更多的字段类型选择以及字段修饰,可以去查看一下文档:数据库:
迁移
好了,要对数据库做的更改都定义好了,下面就是真正的执行迁移工作了:
6. 执行迁移:
在执行迁移之前,还需要执行一个命令composer dump-autoload
,这个命令的主要作用是让 composer
更新autoload_classmap
的内容,包含到我们新建的文件,具体可参考下这篇文章深入
Composer autoload
composer dump-autoload
然后执行
php artisan migrate
输出结果为:
然后我们查看一下数据库,发现goods
表生成了!
同理,如果你想在这个表中新增一个字段,可以从第四步到第六步再走一遍,只不过这次不再是创建表,但是流程是一样的.
7. 数据库回滚:
有时候我们想撤销对数据库做的修改,比如上面新增了一张表,我现在想删除那张表怎么办,这个时候就可以使用migrations
的回滚rollback
命令:
php artisan migrate:rollback
注意,这个命令并不是回滚所有的migrate
操作,而是回滚你上一次的操作,如果你想执行所有的回滚,可以使用reset
命令,执行后会按照迁移文件的时间排序执行所有文件的down
方法;
php artisan migrate:reset
8. 重建整个数据库
使用refresh
命令,可以回滚所有的操作,然后再次执行所有的迁移,实际就是按照时间排序执行所有的down
方法,然后再执行所有的up
方法;
php artisan migrate:refresh
数据填充
1. 生成Seeder
文件:
现在我们已经建立起了数据库表的结构,但是现在表中并没有测试数据,如何制造一些假数据方便我们测试呢?在Laravel
中我们可以Seeder+Faker
来填充假数据;
假设我们想对goods
表填充一些数据.我们第一步要做的工作是先有一个对应于goods
表的Seeder
文件,让我们通过命令生成一个:
php artisan make:seeder GoodsTableSeeder
执行完后会在database\seeds
目录下看到生成的GoodsTableSeeder
文件:
<?php
use Illuminate\Database\Seeder;
class GoodsTableSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
//
}
}
可以看到,类中只有一个默认的run
方法,这个run
方法就是我们执行数据填充的地方.
2. 编辑Seeder
文件:
2.1 简单的数据填充
我们先尝试着做一次最简单的数据填充,直接使用DB
类来插入一条数据,编辑run
方法:
public function run()
{
DB::table('goods')->insert([
'goods_sn' => 10001,
'goods_name' => '加多宝凉茶',
'prize' => 3.5
]);
}
现在说了半天数据并没有进入数据库啊!莫慌,就差最后一步了: 执行seed
命令:
php artisan db:seed --class=GoodsTableSeeder
执行完之后,就会发现数据已经填充到数据库了:
2.2 使用模型工厂进行批量填充
上面我们简单插入了一条数据,但是明显不过瘾,如果我们想一次插入100条数据,总不能手写100遍吧,这个问题我们可以使用模型工厂
来解决:
当然,使用模型工厂之前,必须要有个对应于goods
表的一个Model
类,让我们执行命令生成一个:
php artisan make:model Models\Good
生成的Model
类 Good
:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Good extends Model
{
//表示对应于表goods
protected $table = 'goods';
}
模型工厂对应于database\factories
中的ModelFactory.php
文件,在这个文件中,我们新增一段代码:
$factory->define(\App\Models\Good::class, function (\Faker\Generator $faker) {
return [
'goods_sn' => $faker->numberBetween(10001,20000),
'goods_name' =>$faker->name,
'prize' => $faker->numberBetween(20,50)
];
});
define
方法中第一个参数表示关联Good
模型类,第二个参数传入的是$faker
,Faker
是一个开源类库,主要用于生成一些测试数据,比如电话号码,人名,IP地址等等,这里Laravel
内置了Faker
,因此可以直接使用.
在方法中,对应于每个必须的字段,填充上对应的值;
然后回到GoodsTableSeeder.php
文件,编辑run
方法:
public function run()
{
factory(Good::class)->times(10)->create(); //create()表示插入数据库中
//factory(Good::class)->times(10)->make(); //make()表示只生成对象,不插入库表中
}
这里调用factory方法,times
表示要执行的次数.之后执行命令:
php artisan db:seed --class=GoodsTableSeeder
执行完毕之后,就会发现数据表中新增了十条数据.
2.4 单次执行全部seeder
上面的操作虽然可以完成对一张表批量插入多条数据,但是如果我有多个表都要进来批量插入数据,难道要执行多次db:seed xxx
,当然不用这样,database\seeds
目录下有个DatabaseSeeder.php
文件,这个文件的作用就是对多个seeder
进行管理的,在这里可以调用其他的字Seeder
类,指定他们的执行顺序:
<?php
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Seeder;
class DatabaseSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
Model::unguard(); //解除模型的批量填充限制
$this->call(UsersTableSeeder::class);
$this->call(StatusesTableSeeder::class);
$this->call(RolesTableSeeder::class);
$this->call(AdminUsersTableSeeder::class);
Model::reguard();
}
}
然后我们再执行seed
命令:
php artisan db:seed
这个命令的作用就是执行DatabaseSeeder
的run
方法,因此只需要执行上面的命令,就可执行所有表的填充命令了!
其实还有个最为强大的命令:
php artisan migrate:refresh --seed
这个命令主要做了三件事:
-
执行所有的回滚,也就是
migrations
目录下所有文件的down
方法,执行的时候按照时间顺序. -
所有回滚执行完毕后,执行所有的迁移,也就是按照时间顺序执行所有的
up
方法. -
执行所有的数据填充,也就是执行
DatabaseSeeder
中的run
方法.如果在run
方法中没有调用其他的seeder
,则这个seeder
的run
方法不会被执行.
上一篇: cordova 中获取当前app版本
下一篇: 在线教育的十条弯路 你站在哪里?