生成数据库测试数据

laravel中faker

在laravel中已经自动集成,无需手动安装。如需在其他地方使用,可使用以下命令进行安装

composer require fzaninotto/faker

可通过在 config/app.php 增加如下配置使其支持中文:

'faker_locale' => 'zh_CN',

这样去使用它

$randomDigit = $faker->randomDigit;//生成0-9之间的随机数
$randomDigitNotNull = $faker->randomDigitNotNull;//生成1-9之间的随机数
$randomNumber = $faker->randomNumber(5, true);//生成5位整数,true表示严格模式,即只能5位
$randomFloat = $faker->randomFloat(2, 0, 10);//生成浮点数,两位小数点,范围是0-10之间
$numberBetween = $faker->numberBetween(0, 100);//生成随机整数,范围是0-100之间

生成规则还有很多,可以在这里查看具体
点我

在测试数据时,想要使用Faker去生成数据去测试,不可能一条一条的去生成数据吧。
这个时候,就用到了工厂
创建工厂

在测试时,您可能需要在执行测试之前向数据库中插入一些记录。 Laravel允许您使用模型工厂为每个 Eloquent模型
定义默认属性集,而无需在创建此测试数据时手动指定每列的值。

创建工厂命令

php artisan make:factory PostFactory

成功生成后,会将新工厂将放置在您的 database/factories 目录中

还可以在创建工厂时指示工厂创建的模型的名称,–model此选项将使用给定的模型预先填充生成的工厂文件:

php artisan make:factory GoodFactory --model=Good

值得注意的是,这个命令会自动去找与模型名一样的模型进行关联

来,到生成的工厂中编写
通过 faker 属性, 工厂可以访问 Faker PHP 函数库, 它允许你便捷的生成各种随机数据来进行测试

public function definition()
    {
        //获取三级分类的id
        $arr = Category::where('level',3)->pluck('id');
        return [
            'user_id' => 1,
            'title'=>$this->faker->text(20),
            'category_id' => $this->faker->randomElement($arr),
            'description' => $this->faker->text(40),
            'price' => $this->faker->randomFloat(2, 1, 1000),
            'stock' => $this->faker->numberBetween(1,9999),
            'pics' => [
                'http://placeimg.com/640/480/any',
                'http://placeimg.com/640/480/any',
                'http://placeimg.com/640/480/any',
            ],
            'cover' => 'http://placeimg.com/640/480/any',
            'details'=>$this->faker->paragraphs(4,true)
        ];
    }

使用模型工厂

模型工厂定义后,就可以在Eloquent模型上使用
不过,在需要使用的地方要引入HasFactory才可以

class User extends Model
{
    use HasFactory;
}

如果是使用的是直接指定工厂创建的模型的名称的时候,他就会默认将HasFactory引入到所对应的模型中

让我们看一些创建模型的例子

make 方法创建模型但不将他们保存至数据库中

$data = Good::factory()->make();
        return $data;

这个就是只生成数据,但是不保存到数据库中

使用 count 方法创建一个含有多个模型的集合

$data = Good::factory()->count(10)->make();
        return $data;

会生成一个数组

那么,要插入到数据库中,怎么插入呢?

持久化模型

create 方法创建模型实例,并使用 Eloquent 的 save 方法将其持久化到数据库中

$data = Good::factory()->count(100)->create();

那么,在什么地方去编写生成测试数据的代码呢?总不能放在控制器中吧,
所以,我们可以去生成一个填充文件

专门在这个填充文件中去放这个填充数据的代码

public function run()
    {
        //生成大量测试用的商品数据
        Good::factory()->count(300)->create();
    }

然后去填充数据就好了

php artisan db:seed --class=GoodsSeeder

看,数据库已经填充好了

版权声明:
作者:linrux
链接:https://www.tot7.cn/technology/php/44.html
来源:Code林
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
< <上一篇
下一篇>>