Laravel播种工厂但扩展它

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Laravel播种工厂但扩展它相关的知识,希望对你有一定的参考价值。

我想要一个包含两个表Users和Companies的数据库,而users表有一个带有公司ID的外键。所以1家公司可以拥有多个用户。

我在laravel中为此创建了模型,并为每个表创建了一个工厂。

在我的播种机中,我想一次创建多个数据线,并找到了这个解决方案:

factory(AppCompany::class, 10)->create(); 

这适用于公司表。但我需要为users表扩展它,以便搜索可用的公司ID。 我有什么想法可以做到这一点? 如果我不能搜索可用的ID,我也很乐意用“company_id”字段扩展它并从1-10给它随机值(因为我知道这些是现在的ID)。

所以基本上我想扩展它以使用工厂中的字段,但用另一个字段“company_id”扩展它:

factory(AppUsers::class, 10)->create();

这是用户工厂代码:

$factory->define(AppUser::class, function (FakerGenerator $faker) {
    return [
        'first_name' => $faker->firstName,
        'last_name' => $faker->lastName,
        'postcode' => $faker->postcode,
        'city' => $faker->city
    ];
});
答案

在处理这种关系时,定义模型工厂可能会很痛苦。你有几个选择。

Random blind IDs

如果您确定可以使用常见的ID范围,则可以生成随机ID以使关系有效:

$factory->define(AppUser::class, function (FakerGenerator $faker) {
    return [
        // ...
        'company_id' => rand(1, 10),
    ];
});

Inline factories

这是Laracast的截屏视频推广中使用最广泛的方法:

$factory->define(AppUser::class, function (FakerGenerator $faker) {
    return [
        // ...
        'company_id' => factory(AppCompany::class)->create()->id,
    ];
});

或者您可以反过来在公司工厂中创建一个或多个用户。这样,您只需要在其中一个实体上运行factory()

Random ID from database

从Laravel的5.2版本开始,您可以访问名为inRandomOrder的Eloquent方法:

$factory->define(AppUser::class, function (FakerGenerator $faker) {
    return [
        // ...
        'company_id' => Company::inRandomOrder()->first()->id,
    ];
});

Laravel在5.2之前发布的替代方案:

// Laravel 4.2.7 - 5.1:
User::orderByRaw("RAND()")->get();

// Laravel 4.0 - 4.2.6:
User::orderBy(DB::raw('RAND()'))->get();

// Laravel 3:
User::order_by(DB::raw('RAND()'))->get();

// Source: http://stackoverflow.com/a/13931676/65732
另一答案

看起来,您想要创建CompaniesUsers,并且您还希望同时将用户与公司联系起来。如果这是您要实现的目标,那么您可以使用以下内容轻松完成:

factory(AppCompany::class, 10)->create()->each(function($factory) {
    $factory->users()->save(factory(AppUser::class)->make());
});

在这种情况下,您必须使用正确的usersCompany模型中定义foreign key关系方法。

这将创建10家公司,并使用each方法返回该集合的集合,将创建一个用户并与该公司相关联。另外,检查documentation

另一答案

如果您使用的是Laravel 5.2或更高版本,则可以使用:

'company_id' => Company::inRandomOrder()->first()->id

以上是关于Laravel播种工厂但扩展它的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 8 Jetstream:无法使用使用工厂和播种机播种的帐户登录

如何将 null 参数从播种机传递给 Laravel 工厂?

Laravel工厂和枢轴工作台播种

我可以合并一个运行 insert into 的 .sql 文件和一个在 2 列上创建虚拟数据的 Laravel 工厂播种器吗?

Laravel - 播种关系

不能在 Laravel 8 中使用遗留工厂