Php 将数组值传递给laravel工厂

Php 将数组值传递给laravel工厂,php,laravel,laravel-5.4,factory,faker,Php,Laravel,Laravel 5.4,Factory,Faker,我正在尝试使用Laravel 5.4中的fzaninoto/faker和factory创建一个伪数据播种器。我想向工厂发送一个数据数组,在这个数组中,我可以使用faker选择一个随机元素。数组是DB查询的结果,我不想在Modelfactory中递归地执行该查询。这就是我所做的 在播种机中,它称为工厂 factory(App\Models\Types::class, 10)->create(); 在Modelfactory中,功能如下所示 $factory->define(App\M

我正在尝试使用Laravel 5.4中的
fzaninoto/faker
factory
创建一个伪数据播种器。我想向工厂发送一个数据数组,在这个数组中,我可以使用faker选择一个随机元素。数组是DB查询的结果,我不想在Modelfactory中递归地执行该查询。这就是我所做的

在播种机中,它称为工厂

factory(App\Models\Types::class, 10)->create();
在Modelfactory中,功能如下所示

$factory->define(App\Models\Types::class, function (Faker\Generator $faker) {
    $materials = App\Models\Material::pluck('id')->all();
    return [
        'name' => $faker->unique()->word,
        'material_id' => $faker->randomElement($materials),
        'status' => 1,
        'display_status' => 1,
    ];
});

数组
$materials
是通过对
Material
的模型调用在每个循环中创建的,这是我想要避免的。播种更多的数据(比如100000)需要花费太多的时间。是否有任何选项将数据从播种机文件传递到工厂?在工厂定义之前移动模型调用现在可以解决我的问题,因为材质已在其他播种器文件中播种,这会导致空数组,因为默认情况下,
Modelfactory
在开始时加载。

在私有函数上方定义材质,并“使用”它:

$materials = App\Models\Material::pluck('id')->all();
$factory->define(App\Models\Types::class, function (Faker\Generator $faker) use ($materials)
{
    return [
        'name' => $faker->unique()->word,
        'material_id' => $faker->randomElement($materials),
        'status' => 1,
        'display_status' => 1,
    ];
});

我个人认为工厂只是一种填充模型的方法。我负责处理播种机中的关系

假设您有两种型号
类型
材质
。您创建了两个名为
TypeFactory
MaterialFactory
的工厂。例如,
TypeFactory
如下所示:

$factory->define(App\Models\Types::class, function (Faker\Generator $faker) {
    return [
        'display_status' => 1,
        'name' => $faker->unique()->word,
        'status' => 1
    ];
});
然后在
类型
表的播种机中,您可以执行以下操作:

$materials = factory(App\Models\Material::class, 10)->create();

$types = factory(App\Models\Type::class, 100)->make();

$types->each(function($type) use ($materials) {
    $material = $materials->random();

    $type->material()->associate($material);
    $type->save();
});
注意
create()
make()
之间的区别
create()
保持模型,而
make()
只返回模型的实例

这可能与您的问题无关,但
App\Models\Material::pull('id')->all()
不正确。您应该首先检索模型的所有实例,然后调用
pull
方法:

$materialsIds = App\Models\Material::all()->pluck('id');

这将不起作用,因为材料数据只是另一个播种机,将在类型播种机之前执行。由于整个Medelfactory都加载了laravel,因此查询结果将是空数组。我在问题中已经提到了。啊,好的。那么为什么不简单地创建一个返回随机id的查询呢?我仍然需要对每个请求进行db查询。这就是它使播种速度变慢的原因。谢谢你提供的信息。不,不是。因为,材质是使用DatabaseSeeder进行播种的,类型是使用DummySeeder文件进行播种的。所以我不能将这些合并到一个文件中。你知道你可以将其他种子程序文件导入DatabaseSeeder.php。在
run()
方法中,只需执行
$this->调用(DummySeeder::class)
DummySeeder
是可选的。我不能将其包含在
数据库播种器中。