Laravel 實踐之路: 數據庫遷移與數據填充

什麼是數據庫的遷移?

數據庫遷移實際上就是對數據庫庫表的結構變化作版本控制,以前對數據庫庫表結構作修改的方式比較原始,好比說對某張庫表新增了一個字段,都是直接在庫表中執行alter table xxx add .. 的方式直接修改,可是這麼作有些弊端,好比在開發階段,你本身的庫表修改了,還要把這句sql語句傳給別人再執行一遍,這在多人協同開發時不是一種好的方式.那有沒有一種方式能讓咱們對數據庫 庫表的修改作一些簡單的版本控制,同時能讓其餘人很方便的同步咱們對數據庫的修改呢? 答案是咱們可使用Laravel 內置的Migrations .php

對數據庫的管理包括哪些部分?

其實Laravel對數據庫的版本管理主要包括兩部門: 數據庫結構的管理數據的管理.java

  1. 數據庫結構的管理: 主要是對數據庫結構進行管理,好比新增了一張表,某張表增長了一個字段等等.mysql

  2. 數據的管理: 這個主要是管理表中的數據,生成一些填充數據,解決咱們開發調試時沒有測試數據的問題.laravel

數據庫結構管理

要記錄下咱們對數據庫結構所作的更改,咱們可使用Laravel內置 Migrations.sql

下面咱們就走個小例子,看看若是要在數據庫中新增一個庫表具體該怎麼作:數據庫

1. 建立一個數據庫

Laravel要和咱們的數據庫鏈接,首先要有個對應的數據庫,你能夠在PHPMyAdmin或者navicat for mysql 等管理工具新建一張表:閉包

CREATE DATABASE `laravel5`;

2. 配置數據庫的鏈接信息

咱們要使用Laravel管理數據庫,第一步固然是要能鏈接上數據庫,數據庫的鏈接配置信息是放在根目錄下的.env文件中,這裏我鏈接的是本地的數據庫:composer

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel5
DB_USERNAME=root
DB_PASSWORD=123456

3. 安裝LaravelMigrations

若是咱們是第一次使用Migrations,那就要先執行migrate:install命令來支持數據庫的遷移,進入到項目的根目錄,執行安裝命令:函數

php artisan migrate:install

這句話執行了之後,Laravel會在數據庫新建一張migrations表,用這張表來記錄咱們每次對數據庫作的更改:工具

clipboard.png

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目錄下看到多個一個文件:

clipboard.png

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');
    }
}

解釋一下這個文件:

該文件包括兩個函數,updown,up方法是當執行遷移動做時要執行的方法,down方法是在進行數據庫回滾的時候執行的方法,所以updown是一對反方法,up要建立一張表,down就是要刪除一張表,同理,當up中是新增一個字段時,down方法就是刪除一個字段了.

咱們再來看一下up方法中的內容

Schema::create('goods', function (Blueprint $table) {..}
這裏調用Schema操做表的方法來建立表,第二個參數是一個閉包,$table能夠用來定義數據庫表的結構:

$table->increments('id');
建立一個自增加的字段,字段名默認叫id,固然你也能夠改爲其餘名字.

$table->timestamps();
這裏會在表中建立created_atupdated_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

輸出結果爲:

clipboard.png

而後咱們查看一下數據庫,發現goods 表生成了!

clipboard.png

同理,若是你想在這個表中新增一個字段,能夠從第四步到第六步再走一遍,只不過此次再也不是建立表,可是流程是同樣的.

7. 數據庫回滾:

有時候咱們想撤銷對數據庫作的修改,好比上面新增了一張表,我如今想刪除那張表怎麼辦,這個時候就可使用migrations的回滾rollback命令:

php artisan migrate:rollback

注意,這個命令並非回滾全部的migrate操做,而是回滾你上一次的操做,若是你想執行全部的回滾,可使用reset命令,執行後會按照遷移文件的時間排序執行全部文件的down方法;

php artisan migrate:reset

8. 重建整個數據庫

使用refresh命令,能夠回滾全部的操做,而後再次執行全部的遷移,實際就是按照時間排序執行全部的down方法,而後再執行全部的up方法;

php artisan migrate:refresh

clipboard.png


數據填充

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

執行完以後,就會發現數據已經填充到數據庫了:
clipboard.png

2.2 使用模型工廠進行批量填充

上面咱們簡單插入了一條數據,可是明顯不過癮,若是咱們想一次插入100條數據,總不能手寫100遍吧,這個問題咱們可使用模型工廠來解決:
固然,使用模型工廠以前,必需要有個對應於goods表的一個Model類,讓咱們執行命令生成一個:

php artisan make:model Models\Good

生成的ModelGood:

<?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

這個命令主要作了三件事:

  1. 執行全部的回滾,也就是migrations目錄下全部文件的down方法,執行的時候按照時間順序.

  2. 全部回滾執行完畢後,執行全部的遷移,也就是按照時間順序執行全部的up方法.

  3. 執行全部的數據填充,也就是執行DatabaseSeeder 中的run方法.若是在run方法中沒有調用其餘的seeder,則這個seederrun方法不會被執行.

相關文章
相關標籤/搜索