gpt4 book ai didi

php - 将数组值传递给 Laravel 工厂

转载 作者:行者123 更新时间:2023-12-02 20:42:57 24 4
gpt4 key购买 nike

我正在尝试在 Laravel 5.4 中使用 fzaninotto/fakerfactory 创建一个假数据播种器。我想将一组数据发送到工厂,在其中我可以使用 faker 选择一个随机元素。该数组是数据库查询的结果,我不想在模型工厂中递归执行该查询。这是我所做的。

在播种器中,它调用工厂。

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 个)需要太多时间。是否有任何选项将数据从播种器文件传递到工厂?将模型调用移到工厂定义之前现在可以解决我的问题,因为 Material 被播种到其他一些播种文件中,这会导致空数组,因为默认情况下会在开头加载 Modelfactory

最佳答案

我个人认为工厂只是一种填补fillable attributes的方式一个模型的。我负责处理播种者中的关系。

假设您有两个模型:TypeMaterial。您创建两个名为 TypeFactoryMaterialFactory 的工厂。例如 TypeFactory 如下:

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

然后在 types 表的播种器中,您可以执行以下操作:

$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::pluck('id')->all() 不正确。您应该首先检索模型的所有实例,然后调用 pluck 方法:

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

关于php - 将数组值传递给 Laravel 工厂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45507225/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com