引言
上一章我們瞭解了使用laravel遷移功能建立資料庫表,把DBA的工作挪到開發端,這樣把崗位都省出來了。
但是隻有光禿禿的資料庫表,有個殼子沒有資料確實沒啥用。本文為大家講講laravel怎麼給資料庫造假資料,堂而皇之地假裝生產。
本文使用的構建方式都是寫髒資料,亂資料,無實質意義的資料,只對應用程式和資料庫有用,別的嘛用沒有!
程式碼時間
就好比說種地要有種子,有了種子就可以長出莊稼和糧食;子子孫孫無窮盡也。
資料庫也一樣,資料庫表就好比是地,種地我們得有種子,才能在命令列這樣使用:
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 協議》,轉載必須註明作者和本文連結