說明
在學習laravel入門教程中:第十章微博CURD-》顯示微博,這個章節中,填充示例微博資料的時候,對於檔案(StatusesTableSeeder)中的生成資料方法,研究了半天,由於原來沒怎麼使用過閉包函式(匿名函式),所以搞了研究了很長時間,才搞明白,自己研究明白後,突然感覺教程方法可以換種方式寫,會更加容易理解(只是個人感覺,這裡看個人習慣),所以在這裡跟大家分享一下,我的思路如下
(1) 分析教程中的實現方法。
(2) 修改方法
分析教程中的實現方法。
- 生成假資料的【模型工廠】,使用make:factory來生成工廠類檔案,並填入該模型欄位對應的隨機資料
php artisan make:factory StatusFactory
<?php use Faker\Generator as Faker; $factory->define(App\Models\Status::class, function (Faker $faker) { $date_time = $faker->date . ' ' . $faker->time; return [ 'content' => $faker->text(), 'created_at' => $date_time, 'updated_at' => $date_time, ]; });
注意:這個地方中define中第一個引數(App\Models\Status::class)建立之初預設為(Models::class),需要修改自己要填充的模型檔案,要不在填充資料的時候總是報錯,這個地方我已經出現了好幾次錯誤,總是忘記改。
- 接著建立一個 StatusesTableSeeder 檔案來對微博假資料進行批次生成。
php artisan make:seeder StatusesTableSeeder
<?php use Illuminate\Database\Seeder; use App\Models\User; use App\Models\Status; class StatusesTableSeeder extends Seeder { public function run() { $user_ids = ['1','2','3']; $faker = app(Faker\Generator::class); $statuses = factory(Status::class)->times(100)->make()->each(function ($status) use ($faker, $user_ids) { $status->user_id = $faker->randomElement($user_ids); }); Status::insert($statuses->toArray()); } }
注意:
這個地方$faker
相當於把(Faker\Generator::class
)放到app容器裡面
這個地方的each
中閉包函式的引數$status
,為make生成集合的每條資料,$faker
為容器例項,$user_ids
為上邊定義的陣列引數
*這個地方的容器引入是我後邊要做修改的地方,因為我覺得,第一步的時候是給模型欄位賦隨機值的方法,在這個地方的閉包函式中在次賦值,我認為不好理解,具體修改方法,後邊會介紹。
3.接下來我們需要在 DatabaseSeeder
類中指定呼叫微博資料填充檔案。
<?php
use Illuminate\Database\Seeder;
use Illuminate\Database\Eloquent\Model;
class DatabaseSeeder extends Seeder
{
public function run()
{
Model::unguard();
$this->call(UsersTableSeeder::class);
$this->call(StatusesTableSeeder::class);//這裡是本次需要填充的資料方法
Model::reguard();
}
}
修改方法
填充資料的邏輯其實就是,第一步在工廠檔案裡面定義每個欄位的隨機值,第二步就是在seeder檔案裡面實現資料的填充,教程中把user_id這個欄位在上邊第二步的時候,透過迴圈在閉包函式里面在重新賦值,我的方法是把閉包函式里面的這個欄位,移到工廠檔案裡面去。
一:修改工廠檔案<?php /** @var \Illuminate\Database\Eloquent\Factory $factory */ use App\Model; use Faker\Generator as Faker; $factory->define(App\Models\Status::class, function (Faker $faker) { $date_time = $faker->date . ' ' . $faker->time; $user_ids = ['1','2','3'];//這裡是我新增 return [ 'content' => $faker->text(), 'created_at' => $date_time, 'updated_at' => $date_time, 'user_id' => $faker->randomElement($user_ids),//這裡是我新增 ]; });
二:修改seeder檔案:
<?php use Illuminate\Database\Seeder; use App\Models\User; use App\Models\Status; class StatusesTableSeeder extends Seeder { public function run() { $statuses = factory(Status::class)->times(100)->make(); Status::insert($statuses->toarray()); } }
總結:這裡修改完,也許沒有了閉包函式,顯得程式沒有那麼高大上了,但是對於初學者,或許有幫助,更好的理解資料填充的知識,希望對大家有所幫助。
本作品採用《CC 協議》,轉載必須註明作者和本文連結