Laravel 入門教程中-資料填充-修改分享

liuguowei163發表於2020-01-17

說明

    在學習laravel入門教程中:第十章微博CURD-》顯示微博,這個章節中,填充示例微博資料的時候,對於檔案(StatusesTableSeeder)中的生成資料方法,研究了半天,由於原來沒怎麼使用過閉包函式(匿名函式),所以搞了研究了很長時間,才搞明白,自己研究明白後,突然感覺教程方法可以換種方式寫,會更加容易理解(只是個人感覺,這裡看個人習慣),所以在這裡跟大家分享一下,我的思路如下
     (1)  分析教程中的實現方法。
     (2)  修改方法

分析教程中的實現方法。

  1. 生成假資料的【模型工廠】,使用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),需要修改自己要填充的模型檔案,要不在填充資料的時候總是報錯,這個地方我已經出現了好幾次錯誤,總是忘記改。

  2. 接著建立一個 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 協議》,轉載必須註明作者和本文連結

相關文章