引言
上一章我們瞭解了使用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' => '[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領域原創作者