日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

Laravel 实践之路: 数据库迁移与数据填充

發(fā)布時間:2025/7/25 数据库 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Laravel 实践之路: 数据库迁移与数据填充 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

數(shù)據(jù)庫遷移實(shí)際上就是對數(shù)據(jù)庫庫表的結(jié)構(gòu)變化做版本控制,之前對數(shù)據(jù)庫庫表結(jié)構(gòu)做修改的方式比較原始,比如說對某張庫表新增了一個字段,都是直接在庫表中執(zhí)行alter table xxx add ..?的方式直接修改,但是這么做有些弊端,比如在開發(fā)階段,你自己的庫表修改了,還要把這句sql語句傳給別人再執(zhí)行一遍,這在多人協(xié)同開發(fā)時不是一種好的方式.那有沒有一種方式能讓我們對數(shù)據(jù)庫 庫表的修改做一些簡單的版本控制,同時能讓其他人很方便的同步我們對數(shù)據(jù)庫的修改呢? 答案是我們可以使用Laravel?內(nèi)置的Migrations?.

對數(shù)據(jù)庫的管理包括哪些部分?

其實(shí)Laravel對數(shù)據(jù)庫的版本管理主要包括兩部門:?數(shù)據(jù)庫結(jié)構(gòu)的管理?和數(shù)據(jù)的管理.

  • 數(shù)據(jù)庫結(jié)構(gòu)的管理:?主要是對數(shù)據(jù)庫結(jié)構(gòu)進(jìn)行管理,比如新增了一張表,某張表增加了一個字段等等.

  • 數(shù)據(jù)的管理:?這個主要是管理表中的數(shù)據(jù),生成一些填充數(shù)據(jù),解決我們開發(fā)調(diào)試時沒有測試數(shù)據(jù)的問題.

  • 數(shù)據(jù)庫結(jié)構(gòu)管理

    要記錄下我們對數(shù)據(jù)庫結(jié)構(gòu)所做的更改,我們可以使用Laravel內(nèi)置?Migrations.

    下面我們就走個小例子,看看如果要在數(shù)據(jù)庫中新增一個庫表具體該怎么做:

    1. 創(chuàng)建一個數(shù)據(jù)庫

    Laravel要和我們的數(shù)據(jù)庫連接,首先要有個對應(yīng)的數(shù)據(jù)庫,你可以在PHPMyAdmin或者navicat for mysql等管理工具新建一張表:

    CREATE?DATABASE?`laravel5`;

    2. 配置數(shù)據(jù)庫的連接信息

    我們要使用Laravel管理數(shù)據(jù)庫,第一步當(dāng)然是要能連接上數(shù)據(jù)庫,數(shù)據(jù)庫的連接配置信息是放在根目錄下的.env文件中,這里我連接的是本地的數(shù)據(jù)庫:

    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,那就要先執(zhí)行migrate:install命令來支持?jǐn)?shù)據(jù)庫的遷移,進(jìn)入到項目的根目錄,執(zhí)行安裝命令:

    php artisan migrate:install

    這句話執(zhí)行了以后,Laravel會在數(shù)據(jù)庫新建一張migrations表,用這張表來記錄我們每次對數(shù)據(jù)庫做的更改:

    4. 創(chuàng)建遷移文件

    以上三步是我們在首次使用Migrations是需要做的,相當(dāng)于初始化工作,以后每次的更改只需要做下面的工作,好,我們接著往下走.我們的目標(biāo)是創(chuàng)建一張表,比如說就創(chuàng)建一張商品表goods,首先我們用artisan命令來創(chuàng)建一個對應(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í)行完畢以后, 我們可以在database\migrations目錄下看到多個一個文件:

    5. 編輯遷移文件:

    我們首先看一下這個文件的結(jié)構(gòu),

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

    解釋一下這個文件:

    該文件包括兩個函數(shù),up和down,up方法是當(dāng)執(zhí)行遷移動作時要執(zhí)行的方法,down方法是在進(jìn)行數(shù)據(jù)庫回滾的時候執(zhí)行的方法,因此up和down是一對反方法,up要創(chuàng)建一張表,down就是要刪除一張表,同理,當(dāng)up中是新增一個字段時,down方法就是刪除一個字段了.

    我們再來看一下up方法中的內(nèi)容

    Schema::create('goods', function (Blueprint $table) {..}
    這里調(diào)用Schema操作表的方法來創(chuàng)建表,第二個參數(shù)是一個閉包,$table可以用來定義數(shù)據(jù)庫表的結(jié)構(gòu):

    $table->increments('id');
    創(chuàng)建一個自增長的字段,字段名默認(rèn)叫id,當(dāng)然你也可以改成其他名字.

    $table->timestamps();
    這里會在表中創(chuàng)建created_at?和?updated_at?字段.

    我們所需要的當(dāng)然不止這么簡單,下面我們就增加一些我們需要的字段:

    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方法中新增了三個字段,關(guān)于更多的字段類型選擇以及字段修飾,可以去查看一下文檔:數(shù)據(jù)庫: 遷移
    好了,要對數(shù)據(jù)庫做的更改都定義好了,下面就是真正的執(zhí)行遷移工作了:

    6. 執(zhí)行遷移:

    在執(zhí)行遷移之前,還需要執(zhí)行一個命令composer dump-autoload,這個命令的主要作用是讓?composer?更新autoload_classmap?的內(nèi)容,包含到我們新建的文件,具體可參考下這篇文章深入 Composer autoload

    composer?dump-autoload

    然后執(zhí)行

    php?artisan migrate

    輸出結(jié)果為:

    然后我們查看一下數(shù)據(jù)庫,發(fā)現(xiàn)goods?表生成了!

    同理,如果你想在這個表中新增一個字段,可以從第四步到第六步再走一遍,只不過這次不再是創(chuàng)建表,但是流程是一樣的.

    7. 數(shù)據(jù)庫回滾:

    有時候我們想撤銷對數(shù)據(jù)庫做的修改,比如上面新增了一張表,我現(xiàn)在想刪除那張表怎么辦,這個時候就可以使用migrations的回滾rollback命令:

    php artisan migrate:rollback

    注意,這個命令并不是回滾所有的migrate操作,而是回滾你上一次的操作,如果你想執(zhí)行所有的回滾,可以使用reset命令,執(zhí)行后會按照遷移文件的時間排序執(zhí)行所有文件的down方法;

    php artisan migrate:reset

    8. 重建整個數(shù)據(jù)庫

    使用refresh命令,可以回滾所有的操作,然后再次執(zhí)行所有的遷移,實(shí)際就是按照時間排序執(zhí)行所有的down方法,然后再執(zhí)行所有的up方法;

    php?artisan migrate:refresh


    數(shù)據(jù)填充

    1. 生成Seeder文件:

    現(xiàn)在我們已經(jīng)建立起了數(shù)據(jù)庫表的結(jié)構(gòu),但是現(xiàn)在表中并沒有測試數(shù)據(jù),如何制造一些假數(shù)據(jù)方便我們測試呢?在Laravel中我們可以Seeder+Faker來填充假數(shù)據(jù);

    假設(shè)我們想對goods表填充一些數(shù)據(jù).我們第一步要做的工作是先有一個對應(yīng)于goods表的Seeder文件,讓我們通過命令生成一個:

    php?artisan make:seeder GoodsTableSeeder

    執(zhí)行完后會在database\seeds?目錄下看到生成的GoodsTableSeeder文件:

    <?phpuse Illuminate\Database\Seeder; class GoodsTableSeeder extends Seeder { /** * Run the database seeds. * * @return void */ public function run() { // } }

    可以看到,類中只有一個默認(rèn)的run方法,這個run方法就是我們執(zhí)行數(shù)據(jù)填充的地方.

    2. 編輯Seeder文件:

    2.1 簡單的數(shù)據(jù)填充

    我們先嘗試著做一次最簡單的數(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ù)庫啊!莫慌,就差最后一步了: 執(zhí)行seed命令:

    php artisan db:seed --class=GoodsTableSeeder

    執(zhí)行完之后,就會發(fā)現(xiàn)數(shù)據(jù)已經(jīng)填充到數(shù)據(jù)庫了:

    2.2 使用模型工廠進(jìn)行批量填充

    上面我們簡單插入了一條數(shù)據(jù),但是明顯不過癮,如果我們想一次插入100條數(shù)據(jù),總不能手寫100遍吧,這個問題我們可以使用模型工廠來解決:
    當(dāng)然,使用模型工廠之前,必須要有個對應(yīng)于goods表的一個Model類,讓我們執(zhí)行命令生成一個:

    php?artisan make:model Models\Good

    生成的Model類?Good:

    <?phpnamespace App\Models;use Illuminate\Database\Eloquent\Model; class Good extends Model { //表示對應(yīng)于表goods protected $table = 'goods'; }

    模型工廠對應(yīng)于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?方法中第一個參數(shù)表示關(guān)聯(lián)Good模型類,第二個參數(shù)傳入的是$faker,Faker是一個開源類庫,主要用于生成一些測試數(shù)據(jù),比如電話號碼,人名,IP地址等等,這里L(fēng)aravel內(nèi)置了Faker,因此可以直接使用.
    在方法中,對應(yīng)于每個必須的字段,填充上對應(yīng)的值;

    然后回到GoodsTableSeeder.php文件,編輯run方法:

    public function run() { factory(Good::class)->times(10)->create(); //create()表示插入數(shù)據(jù)庫中 //factory(Good::class)->times(10)->make(); //make()表示只生成對象,不插入庫表中 }

    這里調(diào)用factory方法,times表示要執(zhí)行的次數(shù).之后執(zhí)行命令:

    php artisan db:seed --class=GoodsTableSeeder

    執(zhí)行完畢之后,就會發(fā)現(xiàn)數(shù)據(jù)表中新增了十條數(shù)據(jù).

    2.4 單次執(zhí)行全部seeder

    上面的操作雖然可以完成對一張表批量插入多條數(shù)據(jù),但是如果我有多個表都要進(jìn)來批量插入數(shù)據(jù),難道要執(zhí)行多次db:seed xxx,當(dāng)然不用這樣,database\seeds目錄下有個DatabaseSeeder.php文件,這個文件的作用就是對多個seeder進(jìn)行管理的,在這里可以調(diào)用其他的字Seeder類,指定他們的執(zhí)行順序:

    <?phpuse 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(); } }

    然后我們再執(zhí)行seed命令:

    php?artisan db:seed

    這個命令的作用就是執(zhí)行DatabaseSeeder?的run方法,因此只需要執(zhí)行上面的命令,就可執(zhí)行所有表的填充命令了!

    其實(shí)還有個最為強(qiáng)大的命令:

    php artisan migrate:refresh?--seed

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

  • 執(zhí)行所有的回滾,也就是migrations目錄下所有文件的down方法,執(zhí)行的時候按照時間順序.

  • 所有回滾執(zhí)行完畢后,執(zhí)行所有的遷移,也就是按照時間順序執(zhí)行所有的up方法.

  • 執(zhí)行所有的數(shù)據(jù)填充,也就是執(zhí)行DatabaseSeeder?中的run方法.如果在run方法中沒有調(diào)用其他的seeder,則這個seeder的run方法不會被執(zhí)行.

  • ?

    ?

    定義路由在web.php中

    轉(zhuǎn)載于:https://www.cnblogs.com/zhangtianle/p/7682055.html

    總結(jié)

    以上是生活随笔為你收集整理的Laravel 实践之路: 数据库迁移与数据填充的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。