數據庫遷移實際上就是對數據庫庫表的結構變化作版本控制,以前對數據庫庫表結構作修改的方式比較原始,好比說對某張庫表新增了一個字段,都是直接在庫表中執行alter table xxx add ..
的方式直接修改,可是這麼作有些弊端,好比在開發階段,你本身的庫表修改了,還要把這句sql
語句傳給別人再執行一遍,這在多人協同開發時不是一種好的方式.那有沒有一種方式能讓咱們對數據庫 庫表的修改作一些簡單的版本控制,同時能讓其餘人很方便的同步咱們對數據庫的修改呢? 答案是咱們可使用Laravel
內置的Migrations
.php
其實Laravel
對數據庫的版本管理主要包括兩部門: 數據庫結構的管理 和數據的管理.java
數據庫結構的管理: 主要是對數據庫結構進行管理,好比新增了一張表,某張表增長了一個字段等等.mysql
數據的管理: 這個主要是管理表中的數據,生成一些填充數據,解決咱們開發調試時沒有測試數據的問題.laravel
要記錄下咱們對數據庫結構所作的更改,咱們可使用Laravel
內置 Migrations
.sql
下面咱們就走個小例子,看看若是要在數據庫中新增一個庫表具體該怎麼作:數據庫
Laravel
要和咱們的數據庫鏈接,首先要有個對應的數據庫,你能夠在PHPMyAdmin
或者navicat for mysql
等管理工具新建一張表:閉包
CREATE DATABASE `laravel5`;
咱們要使用Laravel
管理數據庫,第一步固然是要能鏈接上數據庫,數據庫的鏈接配置信息是放在根目錄下的.env
文件中,這裏我鏈接的是本地的數據庫:composer
DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=laravel5 DB_USERNAME=root DB_PASSWORD=123456
Laravel
的Migrations
若是咱們是第一次使用Migrations
,那就要先執行migrate:install
命令來支持數據庫的遷移,進入到項目的根目錄,執行安裝命令:函數
php artisan migrate:install
這句話執行了之後,Laravel
會在數據庫新建一張migrations
表,用這張表來記錄咱們每次對數據庫作的更改:工具
以上三步是咱們在首次使用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目錄下看到多個一個文件:
咱們首先看一下這個文件的結構,
<?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
方法中新增了三個字段,關於更多的字段類型選擇以及字段修飾,能夠去查看一下文檔:數據庫: 遷移
好了,要對數據庫作的更改都定義好了,下面就是真正的執行遷移工做了:
在執行遷移以前,還須要執行一個命令composer dump-autoload
,這個命令的主要做用是讓 composer
更新 autoload_classmap
的內容,包含到咱們新建的文件,具體可參考下這篇文章深刻 Composer autoload
composer dump-autoload
而後執行
php artisan migrate
輸出結果爲:
而後咱們查看一下數據庫,發現goods
表生成了!
同理,若是你想在這個表中新增一個字段,能夠從第四步到第六步再走一遍,只不過此次再也不是建立表,可是流程是同樣的.
有時候咱們想撤銷對數據庫作的修改,好比上面新增了一張表,我如今想刪除那張表怎麼辦,這個時候就可使用migrations
的回滾rollback
命令:
php artisan migrate:rollback
注意,這個命令並非回滾全部的migrate
操做,而是回滾你上一次的操做,若是你想執行全部的回滾,可使用reset
命令,執行後會按照遷移文件的時間排序執行全部文件的down
方法;
php artisan migrate:reset
使用refresh
命令,能夠回滾全部的操做,而後再次執行全部的遷移,實際就是按照時間排序執行全部的down
方法,而後再執行全部的up
方法;
php artisan migrate:refresh
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
方法就是咱們執行數據填充的地方.
Seeder
文件:咱們先嚐試着作一次最簡單的數據填充,直接使用DB
類來插入一條數據,編輯run
方法:
public function run() { DB::table('goods')->insert([ 'goods_sn' => 10001, 'goods_name' => '加多寶涼茶', 'prize' => 3.5 ]); }
如今說了半天數據並無進入數據庫啊!莫慌,就差最後一步了: 執行seed
命令:
php artisan db:seed --class=GoodsTableSeeder
執行完以後,就會發現數據已經填充到數據庫了:
上面咱們簡單插入了一條數據,可是明顯不過癮,若是咱們想一次插入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
執行完畢以後,就會發現數據表中新增了十條數據.
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
方法不會被執行.