前言
數據庫遷移實際上就是對數據庫庫表的結構變化做版本控制,之前對數據庫庫表結構做修改的方式比較原始,比如說對某張庫表新增了一個字段,都是直接在庫表中執行alter table xxx add .. 的方式直接修改,但是這么做有些弊端,比如在開發階段,你自己的庫表修改了,還要把這句sql語句傳給別人再執行一遍,這在多人協同開發時不是一種好的方式.那有沒有一種方式能讓我們對數據庫 庫表的修改做一些簡單的版本控制,同時能讓其他人很方便的同步我們對數據庫的修改呢?
答案是我們可以使用Laravel 內置的Migrations .
對數據庫的管理包括哪些部分?
其實Laravel對數據庫的版本管理主要包括兩部門: 數據庫結構的管理 和數據的管理.
- 數據庫結構的管理: 主要是對數據庫結構進行管理,比如新增了一張表,某張表增加了一個字段等等.
- 數據的管理: 這個主要是管理表中的數據,生成一些填充數據,解決我們開發調試時沒有測試數據的問題.
經常我們做項目都團隊協作開發,每個人都在自己本地的數據庫,如果你曾經出現過讓同事手動在數據庫結構中添加字段的情況,數據庫遷移可以解決你這個問題。
不僅如此,在線上部署的時候,也避免了手動導入數據庫或手動修改數據結構的麻煩,數據遷移幫你方便的維護著數據結構。
數據填充,讓我們測試的時候需要大量的假數據不再一條一條的去造數據,可以輕松的批量填充大量數據。
本文基于Laravel5.5,其他版本大同小異。
數據遷移
假如我們需要一張學生表,我們不再使用原生SQl語句去創建表。
創建遷移文件
前提是已經配置好了數據庫連接信息
php artisan make:migration create_students_table
此命令會在database/migrations/目錄生成類似2017_10_28_035802_create_students_table.php的文件
我們在里邊添加students表的數據結構
<?php use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; class CreateStudentsTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { // students為表名稱 Schema::create('students', function (Blueprint $table) { // 存儲引擎 $table->engine = 'InnoDB'; // id自增 $table->increments('id'); // 學生名稱 $table->string('name'); // 性別 $table->string('sex'); // 郵箱 $table->string('email'); // 喜愛的顏色 $table->string('favorite_color'); // 手機號 $table->string('phone'); // 地址 $table->string('addr'); // 自動維護時間戳 $table->timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('students'); } }
更多用法,請參考官方手冊。
運行遷移
php artisan migrate
這樣會運行database/migrations/目錄的所有遷移文件,并自動創建migrations表,來記錄已經運行過的遷移文件,防止重復運行。
我們看一下數據庫是不是自動創建了students表了呢。
如果出現以下錯誤:
[Illuminate\Database\QueryException] SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was t oo long; max key length is 767 bytes (SQL: alter table users add unique users_email_unique(email)) [PDOException] SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was t oo long; max key length is 767 bytes
在database/migrations/目錄里會有laravel自帶的用戶和重置密碼的兩個遷移文件,會一并運行。
在這里我們這樣解決,修改數據庫配置文件config/database.php里的mysql下的字符集為utf8即可
'charset' => 'utf8', 'collation' => 'utf8_unicode_ci',
想知道為什么,可猛戳:http://www.jb51.net/article/127319.htm
數據填充(支持中文)
創建學生表Eloquent模型
在app目錄下創建Student.php
<?php namespace App; use Illuminate\Database\Eloquent\Model; /** * 學生模型 */ class Student extends Model { }
創建填充文件
php artisan make:seed StudentsTableSeeder