Laravel 入门教程中-数据填充-修改分享

说明

    在学习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 协议》,转载必须注明作者和本文链接
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!