php - Laravel 用工厂播种但扩展它

标签 php database laravel testing laravel-5

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

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

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

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

这适用于公司表。但我需要为用户表扩展它,以便它搜索可用的公司 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: http://stackoverflow.com/a/13931676/65732

关于php - Laravel 用工厂播种但扩展它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40762739/

相关文章:

php - 未设置 SendGrid 类别

javascript - Yii2:注册 Asset Bundle 与注册外部 Js 文件

php - 尝试对连续的条目重新排序

c# - 关闭 WPF GUI 应用程序的正确方法 : GetCurrentProcess(). Kill()、Environment.Exit(0) 或 this.Shutdown()

mysql - 获取每组中的最后一行并按 ID(pk) DESC 对整个数组进行排序并与其他表连接

php - HTML5 内容可编辑

android - Android 上的 Couchbase lite - 通用架构?

sql - 当我将记录加倍时,查询需要多长时间?

php - Laravel 自动加载类和特征之间的区别

javascript - Laravel 5 和 AngularJS 从 url 中删除 '#'