開發與維運

3分鐘短文:看傻眼!Laravel給數據庫造假竟成工具鏈

引言

上一章我們瞭解了使用laravel遷移功能創建數據庫表,把DBA的工作挪到開發端,這樣把崗位都省出來了。
但是隻有光禿禿的數據庫表,有個殼子沒有數據確實沒啥用。本文為大家講講laravel怎麼給數據庫造假數據,堂而皇之地假裝生產。

img

本文使用的構建方式都是寫髒數據,亂數據,無實質意義的數據,只對應用程序和數據庫有用,別的嘛用沒有!

代碼時間

就好比說種地要有種子,有了種子就可以長出莊稼和糧食;子子孫孫無窮盡也。
數據庫也一樣,數據庫表就好比是地,種地我們得有種子,才能在命令行這樣使用:

php artisan migrate --seed

或者讓數據庫一切從頭開始,舊的數據清空,然後填充:

php artisan migrate:fresh --seed

這是針對所有的遷移和所有的種子文件而言的,如單獨指定種子文件,可以這樣做:

php artisan db:seed
php artisan db:seed --class=VotesTableSeeder

上一章我們算是把地給準備好了,下面就開始準備一袋種子,使用命令行腳手架指令:

php artisan make:seeder ContactsTableSeeder

上述指令會生成文件 database/seeds/ContactsTableSeeder.php

為了把種子文件引入使用,在 database/seeds/DatabaseSeeder.php 文件內添加如下代碼:

public function run()
{
    $this->call(ContactsTableSeeder::class);
}

然後手動實現 ContactsTableSeeder 類的 run() 方法:

use Illuminate\Database\Seeder;
use Illuminate\Database\Eloquent\Model;
class ContactsTableSeeder extends Seeder
{
    public function run()
    {
        DB::table('contacts')->insert([
            'name' => 'Tom Hanks'
            'email' => '[email protected]',
        ]);
    }
}

看到這兒大家應該熟悉了吧,原生的數據庫CRUD操作,直接指定表名,並 insert 插入一條新的數據。就這麼簡單,就這麼一個動作。
但是,上面的方式,只能創建一條數據,我們要造假,怎麼也得大規模造假,大規模的數據吧。

模型工廠

說一個高深玄乎的概念吧,聽上去高大上,其實用法超簡單。

模型工廠!

這個是啥,就是生產模型的工廠。模型好比一個模具,有了模具,在工廠裡可以加工出來數以千計數以萬計的產品。
模型工廠就是這麼個用法。

還是使用命令行腳手架創建:

php artisan make:factory ContactFactory --model=Contact

上述指令會在 database/factories 目錄下創建一個php文件 ContactFactory.php,我們指定是給 contacts 表
對應的 Contact 模型文件生產數據的。

在文件內添加如下代碼:

use APP\Contact;
use Faker\Generator as Faker;

$factory->define(Contact::class, function (Faker\Generator $faker) {
    return [
        'name' => $faker->name,
        'email' => $faker->email,
    ];
});

這個文件為啥長這樣?為什麼這麼寫?類不類,方法不方法,函數不函數的!沒錯,就是一個代碼片段,laravel約定的東西,
你這麼寫,在執行數據填充和測試的時候,它就起作用!就這麼神奇。

那如何控制填充條數呢?只要在需要填充數據的地方調用工廠類即可:

$contact = factory(Contact::class)->create();

這是一條數據,可以指定創建 500 條:

factory(Contact::class, 500)->create();

怎麼理解呢,就是我們創建了模型工廠類 ContactFactory,然後使用 factory 快捷函數進行實例化調用,並使用工廠類內的數據,
對每個模型發起N次指定方法的調用。

OK,模型工廠有很多奇思妙想的玩法,對於本文就簡單說到這兒吧。

寫在最後

本文介紹了使用laravel的Seeder進行數據填充,為了高效填充,我們介紹了工廠模式,這個高級玩意兒,確實用法有點偏,本不在五行八卦之列。希望大家用的開心。

Happy coding 🙂

我是@程序員小助手,專注編程知識,圈子動態的IT領域原創作者

Leave a Reply

Your email address will not be published. Required fields are marked *