使用工厂进行Laravel种子填充,但是对其进行扩展。

8 浏览
0 Comments

使用工厂进行Laravel种子填充,但是对其进行扩展。

我希望创建一个数据库,其中包含两个表,用户表和公司表,用户表有一个与公司ID相关联的外键,因此一个公司可以有多个用户。

我在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
    ];
});

admin 更改状态以发布 2023年5月24日
0
0 Comments

看起来,你想同时创建 CompaniesUsers,并且你希望同时将用户附加到公司中。如果你确实是这样想的,那么你可以轻松地使用以下方法实现:

factory(App\Company::class, 10)->create()->each(function($factory) {
    $factory->users()->save(factory(App\User::class)->make());
});

在这种情况下,你需要在你的 Company 模型中定义 users 关系方法,并使用正确的 foreign key

这将创建10个公司并返回一个集合,使用 each 方法在该集合上创建并附加一个单个的用户。还要检查 文档

0
0 Comments

当处理这种关系时,定义模型工厂可能会很繁琐。不过,你有几个选择。

随机盲目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版本开始,你可以访问一个Eloquent方法称为inRandomOrder

$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

0