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

程式設計師小助手發表於2020-10-29

引言

上一章我們瞭解了使用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' => 'tomhanks@gmail.com',
        ]);
    }
}

看到這兒大家應該熟悉了吧,原生的資料庫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領域原創作者

本作品採用《CC 協議》,轉載必須註明作者和本文連結
write-less-do-more-make-you-out-of-door

相關文章