微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

php – Laravel播种工厂但扩展它

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

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

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

factory(App\Company::class, 10)->create(); 

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

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

factory(App\Users::class, 10)->create();

这是用户工厂代码

$factory->define(App\User::class, function (Faker\Generator $faker) {
    return [
        'first_name' => $faker->firstName,
        'last_name' => $faker->lastName,
        'postcode' => $faker->postcode,
        'city' => $faker->city
    ];
});

解决方法:

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

随机盲ID

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

$factory->define(App\User::class, function (Faker\Generator $faker) {
    return [
        // ...
        'company_id' => rand(1, 10),
    ];
});

内联工厂

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

$factory->define(App\User::class, function (Faker\Generator $faker) {
    return [
        // ...
        'company_id' => factory(App\Company::class)->create()->id,
    ];
});

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

来自数据库随机ID

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

$factory->define(App\User::class, function (Faker\Generator $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: https://stackoverflow.com/a/13931676/65732

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐