Laravel 入门教程中-数据填充-修改分享
说明
在学习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 协议》,转载必须注明作者和本文链接