摘要:什么是數(shù)據(jù)庫(kù)的遷移數(shù)據(jù)庫(kù)遷移實(shí)際上就是對(duì)數(shù)據(jù)庫(kù)庫(kù)表的結(jié)構(gòu)變化做版本控制之前對(duì)數(shù)據(jù)庫(kù)庫(kù)表結(jié)構(gòu)做修改的方式比較原始比如說對(duì)某張庫(kù)表新增了一個(gè)字段都是直接在庫(kù)表中執(zhí)行的方式直接修改但是這么做有些弊端比如在開發(fā)階段你自己的庫(kù)表修改了還要把這句語句傳
什么是數(shù)據(jù)庫(kù)的遷移?
數(shù)據(jù)庫(kù)遷移實(shí)際上就是對(duì)數(shù)據(jù)庫(kù)庫(kù)表的結(jié)構(gòu)變化做版本控制,之前對(duì)數(shù)據(jù)庫(kù)庫(kù)表結(jié)構(gòu)做修改的方式比較原始,比如說對(duì)某張庫(kù)表新增了一個(gè)字段,都是直接在庫(kù)表中執(zhí)行alter table xxx add .. 的方式直接修改,但是這么做有些弊端,比如在開發(fā)階段,你自己的庫(kù)表修改了,還要把這句sql語句傳給別人再執(zhí)行一遍,這在多人協(xié)同開發(fā)時(shí)不是一種好的方式.那有沒有一種方式能讓我們對(duì)數(shù)據(jù)庫(kù) 庫(kù)表的修改做一些簡(jiǎn)單的版本控制,同時(shí)能讓其他人很方便的同步我們對(duì)數(shù)據(jù)庫(kù)的修改呢? 答案是我們可以使用Laravel 內(nèi)置的Migrations .
對(duì)數(shù)據(jù)庫(kù)的管理包括哪些部分?其實(shí)Laravel對(duì)數(shù)據(jù)庫(kù)的版本管理主要包括兩部門: 數(shù)據(jù)庫(kù)結(jié)構(gòu)的管理 和數(shù)據(jù)的管理.
數(shù)據(jù)庫(kù)結(jié)構(gòu)的管理: 主要是對(duì)數(shù)據(jù)庫(kù)結(jié)構(gòu)進(jìn)行管理,比如新增了一張表,某張表增加了一個(gè)字段等等.
數(shù)據(jù)的管理: 這個(gè)主要是管理表中的數(shù)據(jù),生成一些填充數(shù)據(jù),解決我們開發(fā)調(diào)試時(shí)沒有測(cè)試數(shù)據(jù)的問題.
數(shù)據(jù)庫(kù)結(jié)構(gòu)管理要記錄下我們對(duì)數(shù)據(jù)庫(kù)結(jié)構(gòu)所做的更改,我們可以使用Laravel內(nèi)置 Migrations.
下面我們就走個(gè)小例子,看看如果要在數(shù)據(jù)庫(kù)中新增一個(gè)庫(kù)表具體該怎么做:
1. 創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)Laravel要和我們的數(shù)據(jù)庫(kù)連接,首先要有個(gè)對(duì)應(yīng)的數(shù)據(jù)庫(kù),你可以在PHPMyAdmin或者navicat for mysql 等管理工具新建一張表:
CREATE DATABASE `laravel5`;2. 配置數(shù)據(jù)庫(kù)的連接信息
我們要使用Laravel管理數(shù)據(jù)庫(kù),第一步當(dāng)然是要能連接上數(shù)據(jù)庫(kù),數(shù)據(jù)庫(kù)的連接配置信息是放在根目錄下的.env文件中,這里我連接的是本地的數(shù)據(jù)庫(kù):
DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=laravel5 DB_USERNAME=root DB_PASSWORD=1234563. 安裝Laravel的Migrations
如果我們是第一次使用Migrations,那就要先執(zhí)行migrate:install命令來支持?jǐn)?shù)據(jù)庫(kù)的遷移,進(jìn)入到項(xiàng)目的根目錄,執(zhí)行安裝命令:
php artisan migrate:install
這句話執(zhí)行了以后,Laravel會(huì)在數(shù)據(jù)庫(kù)新建一張migrations表,用這張表來記錄我們每次對(duì)數(shù)據(jù)庫(kù)做的更改:
4. 創(chuàng)建遷移文件以上三步是我們?cè)谑状问褂?b>Migrations是需要做的,相當(dāng)于初始化工作,以后每次的更改只需要做下面的工作,好,我們接著往下走.我們的目標(biāo)是創(chuàng)建一張表,比如說就創(chuàng)建一張商品表goods,首先我們用artisan命令來創(chuàng)建一個(gè)對(duì)應(yīng)的遷移文件:
php artisan make:migration create_goods_table --create=goods
執(zhí)行信息如下:
Created Migration: 2017_03_05_214805_create_goods_table
這句話解釋一下, make:migration 是遷移命令,create_goods_table 是遷移文件的文件名,--create=goods是該命令攜帶的參數(shù),意思是創(chuàng)建一張表,并且表名是goods,這句話執(zhí)行完畢以后, 我們可以在databasemigrations目錄下看到多個(gè)一個(gè)文件:
5. 編輯遷移文件:我們首先看一下這個(gè)文件的結(jié)構(gòu),
increments("id"); $table->timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::drop("goods"); } }
解釋一下這個(gè)文件:
該文件包括兩個(gè)函數(shù),up和down,up方法是當(dāng)執(zhí)行遷移動(dòng)作時(shí)要執(zhí)行的方法,down方法是在進(jìn)行數(shù)據(jù)庫(kù)回滾的時(shí)候執(zhí)行的方法,因此up和down是一對(duì)反方法,up要?jiǎng)?chuàng)建一張表,down就是要?jiǎng)h除一張表,同理,當(dāng)up中是新增一個(gè)字段時(shí),down方法就是刪除一個(gè)字段了.
我們?cè)賮砜匆幌?b>up方法中的內(nèi)容
Schema::create("goods", function (Blueprint $table) {..}
這里調(diào)用Schema操作表的方法來創(chuàng)建表,第二個(gè)參數(shù)是一個(gè)閉包,$table可以用來定義數(shù)據(jù)庫(kù)表的結(jié)構(gòu):
$table->increments("id");
創(chuàng)建一個(gè)自增長(zhǎng)的字段,字段名默認(rèn)叫id,當(dāng)然你也可以改成其他名字.
$table->timestamps();
這里會(huì)在表中創(chuàng)建created_at 和 updated_at 字段.
我們所需要的當(dāng)然不止這么簡(jiǎn)單,下面我們就增加一些我們需要的字段:
public function up() { Schema::create("goods", function (Blueprint $table) { $table->increments("id"); $table->integer("goods_sn"); //商品貨號(hào) $table->string("goods_name");//商品名 $table->decimal("prize", 10, 2); //價(jià)格 $table->timestamps(); }); }
up方法中新增了三個(gè)字段,關(guān)于更多的字段類型選擇以及字段修飾,可以去查看一下文檔:數(shù)據(jù)庫(kù): 遷移
好了,要對(duì)數(shù)據(jù)庫(kù)做的更改都定義好了,下面就是真正的執(zhí)行遷移工作了:
在執(zhí)行遷移之前,還需要執(zhí)行一個(gè)命令composer dump-autoload,這個(gè)命令的主要作用是讓 composer 更新 autoload_classmap 的內(nèi)容,包含到我們新建的文件,具體可參考下這篇文章深入 Composer autoload
composer dump-autoload
然后執(zhí)行
php artisan migrate
輸出結(jié)果為:
然后我們查看一下數(shù)據(jù)庫(kù),發(fā)現(xiàn)goods 表生成了!
同理,如果你想在這個(gè)表中新增一個(gè)字段,可以從第四步到第六步再走一遍,只不過這次不再是創(chuàng)建表,但是流程是一樣的.
7. 數(shù)據(jù)庫(kù)回滾:有時(shí)候我們想撤銷對(duì)數(shù)據(jù)庫(kù)做的修改,比如上面新增了一張表,我現(xiàn)在想刪除那張表怎么辦,這個(gè)時(shí)候就可以使用migrations的回滾rollback命令:
php artisan migrate:rollback
注意,這個(gè)命令并不是回滾所有的migrate操作,而是回滾你上一次的操作,如果你想執(zhí)行所有的回滾,可以使用reset命令,執(zhí)行后會(huì)按照遷移文件的時(shí)間排序執(zhí)行所有文件的down方法;
php artisan migrate:reset8. 重建整個(gè)數(shù)據(jù)庫(kù)
使用refresh命令,可以回滾所有的操作,然后再次執(zhí)行所有的遷移,實(shí)際就是按照時(shí)間排序執(zhí)行所有的down方法,然后再執(zhí)行所有的up方法;
php artisan migrate:refresh
現(xiàn)在我們已經(jīng)建立起了數(shù)據(jù)庫(kù)表的結(jié)構(gòu),但是現(xiàn)在表中并沒有測(cè)試數(shù)據(jù),如何制造一些假數(shù)據(jù)方便我們測(cè)試呢?在Laravel中我們可以Seeder+Faker來填充假數(shù)據(jù);
假設(shè)我們想對(duì)goods表填充一些數(shù)據(jù).我們第一步要做的工作是先有一個(gè)對(duì)應(yīng)于goods表的Seeder文件,讓我們通過命令生成一個(gè):
php artisan make:seeder GoodsTableSeeder
執(zhí)行完后會(huì)在databaseseeds 目錄下看到生成的GoodsTableSeeder文件:
可以看到,類中只有一個(gè)默認(rèn)的run方法,這個(gè)run方法就是我們執(zhí)行數(shù)據(jù)填充的地方.
2. 編輯Seeder文件: 2.1 簡(jiǎn)單的數(shù)據(jù)填充我們先嘗試著做一次最簡(jiǎn)單的數(shù)據(jù)填充,直接使用DB類來插入一條數(shù)據(jù),編輯run方法:
public function run() { DB::table("goods")->insert([ "goods_sn" => 10001, "goods_name" => "加多寶涼茶", "prize" => 3.5 ]); }現(xiàn)在說了半天數(shù)據(jù)并沒有進(jìn)入數(shù)據(jù)庫(kù)啊!莫慌,就差最后一步了: 執(zhí)行seed命令:
php artisan db:seed --class=GoodsTableSeeder執(zhí)行完之后,就會(huì)發(fā)現(xiàn)數(shù)據(jù)已經(jīng)填充到數(shù)據(jù)庫(kù)了:
2.2 使用模型工廠進(jìn)行批量填充上面我們簡(jiǎn)單插入了一條數(shù)據(jù),但是明顯不過癮,如果我們想一次插入100條數(shù)據(jù),總不能手寫100遍吧,這個(gè)問題我們可以使用模型工廠來解決:
當(dāng)然,使用模型工廠之前,必須要有個(gè)對(duì)應(yīng)于goods表的一個(gè)Model類,讓我們執(zhí)行命令生成一個(gè):php artisan make:model ModelsGood生成的Model類 Good:
模型工廠對(duì)應(yīng)于databasefactories中的ModelFactory.php文件,在這個(gè)文件中,我們新增一段代碼:
$factory->define(AppModelsGood::class, function (FakerGenerator $faker) { return [ "goods_sn" => $faker->numberBetween(10001,20000), "goods_name" =>$faker->name, "prize" => $faker->numberBetween(20,50) ]; });define 方法中第一個(gè)參數(shù)表示關(guān)聯(lián)Good模型類,第二個(gè)參數(shù)傳入的是$faker,Faker是一個(gè)開源類庫(kù),主要用于生成一些測(cè)試數(shù)據(jù),比如電話號(hào)碼,人名,IP地址等等,這里Laravel內(nèi)置了Faker,因此可以直接使用.
在方法中,對(duì)應(yīng)于每個(gè)必須的字段,填充上對(duì)應(yīng)的值;然后回到GoodsTableSeeder.php文件,編輯run方法:
public function run() { factory(Good::class)->times(10)->create(); //create()表示插入數(shù)據(jù)庫(kù)中 //factory(Good::class)->times(10)->make(); //make()表示只生成對(duì)象,不插入庫(kù)表中 }這里調(diào)用factory方法,times表示要執(zhí)行的次數(shù).之后執(zhí)行命令:
php artisan db:seed --class=GoodsTableSeeder執(zhí)行完畢之后,就會(huì)發(fā)現(xiàn)數(shù)據(jù)表中新增了十條數(shù)據(jù).
2.4 單次執(zhí)行全部seeder上面的操作雖然可以完成對(duì)一張表批量插入多條數(shù)據(jù),但是如果我有多個(gè)表都要進(jìn)來批量插入數(shù)據(jù),難道要執(zhí)行多次db:seed xxx,當(dāng)然不用這樣,databaseseeds目錄下有個(gè)DatabaseSeeder.php文件,這個(gè)文件的作用就是對(duì)多個(gè)seeder進(jìn)行管理的,在這里可以調(diào)用其他的字Seeder類,指定他們的執(zhí)行順序:
call(UsersTableSeeder::class); $this->call(StatusesTableSeeder::class); $this->call(RolesTableSeeder::class); $this->call(AdminUsersTableSeeder::class); Model::reguard(); } }然后我們?cè)賵?zhí)行seed命令:
php artisan db:seed這個(gè)命令的作用就是執(zhí)行DatabaseSeeder 的run方法,因此只需要執(zhí)行上面的命令,就可執(zhí)行所有表的填充命令了!
其實(shí)還有個(gè)最為強(qiáng)大的命令:
php artisan migrate:refresh --seed這個(gè)命令主要做了三件事:
執(zhí)行所有的回滾,也就是migrations目錄下所有文件的down方法,執(zhí)行的時(shí)候按照時(shí)間順序.
所有回滾執(zhí)行完畢后,執(zhí)行所有的遷移,也就是按照時(shí)間順序執(zhí)行所有的up方法.
執(zhí)行所有的數(shù)據(jù)填充,也就是執(zhí)行DatabaseSeeder 中的run方法.如果在run方法中沒有調(diào)用其他的seeder,則這個(gè)seeder的run方法不會(huì)被執(zhí)行.
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/22476.html
摘要:開發(fā)根目錄測(cè)試分為單元測(cè)試和功能測(cè)試創(chuàng)建一個(gè)文件執(zhí)行測(cè)試測(cè)試前清除配置緩存運(yùn)行單個(gè)測(cè)試用例小提示在開發(fā)與進(jìn)行交互的第三方擴(kuò)展包時(shí),最好選擇注入契約而不使用。 參考https://laravelacademy.org/ 概念 單詞 契約Contract 就是接口 repository 倉(cāng)庫(kù)(封裝數(shù)據(jù)訪問,可以搜索:repository模式) Container 容器 ServicePr...
摘要:關(guān)于,它使用起來簡(jiǎn)單且舒適適用于編寫產(chǎn)品代碼,并能極大的推動(dòng)開發(fā)過程。這里有一些在開發(fā)中值得記住的簡(jiǎn)單建議最大限度的使用你的文件不要破壞框架核心,不要編輯文件夾中的文件,你可以選擇繼承相關(guān)函數(shù)來實(shí)現(xiàn)。 showImg(https://segmentfault.com/img/remote/1460000018416776?w=808&h=449); 將任何 PHP 框架稱為最好的框架都...
摘要:關(guān)于,它使用起來簡(jiǎn)單且舒適適用于編寫產(chǎn)品代碼,并能極大的推動(dòng)開發(fā)過程。中我最喜歡的一點(diǎn)是它是使用當(dāng)下編程中的最佳實(shí)踐所構(gòu)建的。的工作原理是這樣的,對(duì)于一個(gè)命名為的表,希望該表的模型被命名為。盡量為每一個(gè)請(qǐng)求創(chuàng)建。 showImg(https://segmentfault.com/img/remote/1460000018303541?w=808&h=449); 將任何 PHP 框架稱為...
摘要:本文首發(fā)于作者這是一篇基礎(chǔ)教程,對(duì)標(biāo)文檔中的數(shù)據(jù)遷移和數(shù)據(jù)填充。那么,中的數(shù)據(jù)庫(kù)遷移概念,就是用于解決團(tuán)隊(duì)中保證數(shù)據(jù)庫(kù)結(jié)構(gòu)一致的方案。和不同,如果多次執(zhí)行就會(huì)進(jìn)行多次數(shù)據(jù)填充。好了,數(shù)據(jù)遷移和數(shù)據(jù)填充的基本操作也就這些了。 showImg(https://segmentfault.com/img/remote/1460000012252769?w=648&h=422); 本文首發(fā)于 h...
摘要:不僅如此,在線上部署的時(shí)候,也避免了手動(dòng)導(dǎo)入數(shù)據(jù)庫(kù)或手動(dòng)修改數(shù)據(jù)結(jié)構(gòu)的麻煩,數(shù)據(jù)遷移幫你方便的維護(hù)著數(shù)據(jù)結(jié)構(gòu)。數(shù)據(jù)遷移假如我們需要一張學(xué)生表,我們不再使用原生語句去創(chuàng)建表。 寫在前面 經(jīng)常我們做項(xiàng)目都團(tuán)隊(duì)協(xié)作開發(fā),每個(gè)人都在自己本地的數(shù)據(jù)庫(kù),如果你曾經(jīng)出現(xiàn)過讓同事手動(dòng)在數(shù)據(jù)庫(kù)結(jié)構(gòu)中添加字段的情況,數(shù)據(jù)庫(kù)遷移可以解決你這個(gè)問題。 不僅如此,在線上部署的時(shí)候,也避免了手動(dòng)導(dǎo)入數(shù)據(jù)庫(kù)或手動(dòng)修...
閱讀 2580·2021-08-11 11:16
閱讀 2999·2019-08-30 15:55
閱讀 3401·2019-08-30 12:53
閱讀 1644·2019-08-29 13:28
閱讀 3327·2019-08-28 18:17
閱讀 1033·2019-08-26 12:19
閱讀 2521·2019-08-23 18:27
閱讀 772·2019-08-23 18:17