--- tags: laravel --- # 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](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](https://github.com/fzaninotto/Faker) ## 生成並編輯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生成資料的陣列
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up