Model Factory 和 Laravel 中的 DB 播种机有啥区别?

Posted

技术标签:

【中文标题】Model Factory 和 Laravel 中的 DB 播种机有啥区别?【英文标题】:What is the difference between Model Factory and a DB seeder in Laravel?Model Factory 和 Laravel 中的 DB 播种机有什么区别? 【发布时间】:2017-10-01 06:40:46 【问题描述】:

Model Factory 和 Laravel 中的 DB 播种机有什么区别?

【问题讨论】:

laracasts.com/discuss/channels/laravel/… 谢谢@MarcinOrlowski 谢谢@MASIDDIQUI。 【参考方案1】:

我更喜欢从另一个角度看待播种机和工厂。

正如其他人所提到的,模型工厂用于测试目的并使用大量虚假数据填充您的数据库。这可用于系统的单元测试和性能测试。

另一方面,Seeder Classes 用于插入对系统运行至关重要且重要的数据。像超级管理员、系统中的基本角色/角色权限、国家、城市和其他可能不是来自 CRUD 的数据

【讨论】:

这是一个很好的答案,但是在我读完之后我马上问自己,为什么?关键的区别是什么?例如,为什么我不应该使用播种机在我的数据库中填充大量日期以进行性能测试? 好问题@JúliusĽuptovec,在播种机中您可以拥有一些私人数据或机密数据,但是当您必须测试您的应用程序时,您不需要机密数据,而只需要随机和大量数据,这就是为什么为这两个目的使用不同的文件是一种好方法 @JúliusĽuptovec 当然,您可以将 Seeder 用作工厂。您可以在 Seeder 中使用 Faker。但我认为这不是我们应该如何使用播种机。 .将播种机视为我们应用程序的预填充数据。假设我们有图书馆应用程序,并且我们有默认的预定义书籍类别(例如小说、医学、烹饪等)。在这种情况下,我们使用 Seeder 的类别列表。同时工厂作为我们测试的预填充数据。因此,为了测试我们的应用程序,我们需要 100 个“假”库成员,在这里我们使用工厂。 . CMIIW【参考方案2】:

我已针对您的问题进行了研究,发现了一些简单的问题,如下所示。

Factory 和 Seeder 都用于为应用程序生成测试数据。


工厂: 通过使用工厂,您可以轻松地为基于模型的 laravel 应用程序创建测试数据。在工厂中,我们使用另一个类如 Faker 来轻松生成假数据。

在工厂中我们还可以生成与关系相关的数据,而在 db seeder 中我们不能。

factory(App\User::class, 50)->create()->each(function ($user) 
        $user->posts()->save(factory(App\Post::class)->make());
);

工厂的另一个例子:

use Illuminate\Support\Str;
use Faker\Generator as Faker;

$factory->define(App\User::class, function (Faker $faker) 
    return [
        'name' => $faker->name,
        'email' => $faker->unique()->safeEmail,
        'email_verified_at' => now(),
        'password' => '$2y$10$TKh8H1.PfQx37YgCzwiKb.KjNyWgaHb9cbcoQgdIVFlYg7B77UdFm', // secret
        'remember_token' => Str::random(10),
    ];
);

播种机: 通过使用播种机,您可以根据您的表名创建测试数据。如下所示。

<?php

use Illuminate\Support\Str;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;

class DatabaseSeeder extends Seeder

    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    
        DB::table('users')->insert([
            'name' => Str::random(10),
            'email' => Str::random(10).'@gmail.com',
            'password' => bcrypt('secret'),
        ]);
    

您可以在这里查看更多信息:

https://laravel.com/docs/5.7/seeding#using-model-factories

https://laravel.com/docs/5.7/database-testing#writing-factories

【讨论】:

【参考方案3】:

数据库播种器用于用数据填充表。

模型工厂是一个方便的集中位置,用于定义应如何使用假数据填充模型。

在播种器类中,您将利用模型工厂,模型工厂很可能会使用另一个库来生成随机假数据,例如fzaninotto/faker.

【讨论】:

以上是关于Model Factory 和 Laravel 中的 DB 播种机有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

laravel 8中扩展模型的工厂

laravel 8 - auth()->factory() 相同的 refresh() 和尝试() 在 JWT Auth Controller 中未定义

laravel seeder factory填充数据

Laravel factory 使用指引

调用Factory时Laravel记录被删除

Symfony\Bridge\PsrHttpMessage\Factory\DiactorosFactory' 未找到 Laravel 护照