---
# System prepended metadata

title: Seeding & Faker

---

# Seeding & Faker


Laravel用來生成資料表資料的技術

5.*版的 Laravel會把所有Seeder檔案放在seeds資料夾，8.*版起則更名為seeders

產生Seeder檔案
php artisan make:seeder {表格名稱單數}Seeder
建立表格模型
php artisan make:model {表格名稱單數}
run方法撰寫範例
\\database\seeders\ItemSeeder.php

use App\Models\Item;

public functin run()
{
    //清除表格所有資料，並將流水號計數器歸零
    Item::truncate();
    //建立假資料
    Item::create(['欄位名稱'=>'值',...]);
}
設定DatabaseSeeder.php
//database\seeders\DatabaseSeeder.php

use Illuminate\Support\Facades\DB;

public function run()
{
    //關閉外鍵偵測
    DB::statement('SET FOREIGN_KEY_CHECKS=0;');
    
    $this->call(ItemSeeder::class);
    
    //開啟外鍵偵測
    DB::statement('SET FOREIGN_KEY_CHECKS=1;');
}
執行Seeding指令
//透過DatabaseSeeder.php
php artisan db:seed

//不透過DatabaseSeeder.php
php artisan db:seed --class={Seeder類別}
指定表格名稱
//App\Models\Item.php

class Item extends Model{
    protected $table = 'titems';
}

補充資料
清除快取
當遇到內容無法正常顯示，或者抓不到檔案時請服用

composer dump-autoload

關閉內建時間戳記欄位
//App\models\Item.php

class Item extends Model{
    protected $timestamps = false;
}

隨機策略
rand(最小值,最大值)  生成隨機數
Carbon
是在PHP裏頭負責處理日期運算的套件，非常強大。

使用前可使用 use \Carbon\Carbon; 來導入

\Carbon\Carbon::setLocale('zh_TW'); 設定Carbon套件的語系
\Carbon\Carbon::now() 使用Carbon套件來生成日期
\Carbon\Carbon::parse($str)  將date字串進行轉換成carbon物件
\Carbon\Carbon::createFromFormat('Y-m-d',$date) 依照參數格式將date字串轉成Carbon物件
Carbon變數->year 取得年份
Carbon變數->month 取得月份
Carbon變數->addDays(8) 將此日期加上8天
Carbon變數->format('Y-m-d')將此日期依照yyyy-mm-dd的方式來呈現
Carbon變數->diffForHumans() 將顯示字串改成口語化表示

如需了解更多的Carbon資訊，可以參考https://kejyuntw.gitbooks.io/laravel-5-learning-notes/package/tool/package-tool-carbon.html

Faker套件
使用Faker來生成假資料

$faker = Faker\Factory::create('zh_TW'); 使用繁中語系
$faker->name 取得名字
$faker->randomDigit 取得0~9的隨機數字
$faker->randomDigitNot(0) 取得1~9的隨機數字
$faker->numberBetween(1,100) 取得1~100的隨機數字
$faker->address 取得地址
$faker->sentence($nbWords =3) 使用3個單字的句子
$faker->text 取得文章
$faker->realText($nbWords = 10) 取得字數為多少的中文內容
$faker->url 取得網址
$faker->imageurl($width = 640 , $height = 480) 取得圖片網址
$faker->unique()->email 取得Email，需為唯一
$faker->optional()->word 取得文字，偶而會得到null
$evenValidator = function($digit){
    return $digit % 2 ==0;
}
$faker->valid($evenValidator)->randomDigit; 取得符合驗證規則的值
PS:如需了解更多的Faker資訊，可以參考Faker Github

生成並編輯ModelFactory類別
Step 1.輸入指令php artisan make:factory {模型類別}Factory

Step 2.把seeder檔案有關欄位定義的內容都移進factory的陣列裡頭

此為5.x的版本

$factory->define(User::class,function(Faker $faker){
    return [
        'name' => $faker->name,
        'email' => $faker->unique()->safeEmail,
        //略
    ];
});
此為8.x的版本

別忘了要自己生成Faker並use類別

protected $model = User::class;

/**
 * Define the model's default state.
 *
 * @return array
 */
public function definition()
{
    $faker = Faker\Factory::create('zh_TW');
    return [
        'name' => $faker->name,
        'email' => $faker->unique()->safeEmail,
    ];
}
將Seeder改用Factory來生成資料
將Seeder裏頭關於欄位資料設定的部分移到Factory來處理，Seeder轉身成業務的腳色，只處理和Factory叫單的作業。只需要說明要叫單的模型類別，Laravel會自動找到對應的Factory類別

此為5.x版本寫法

\\Database\seeders\UserSeeder.php

factory(App\User::class,100)->create();  //建立users表格的假資料，共生成100筆
此為8.x版本寫法

\\Database\seeders\UserSeeder.php

User::factory()->times(100)->create();  //建立users表格的假資料，共生成100筆
factory()的最後面可以接create().make()以及raw()

create() 用Factory生成模型物件的集合後並據此存成資料庫資料
make() 用Factory生成模型物件的集合
raw() 用Factory生成資料的陣列

發表於  HackMD
 365
讚賞 收藏 訂閱