【问题标题】:Laravel Nested Relationship on Factory for TestingLaravel 用于测试的工厂嵌套关系
【发布时间】:2016-06-25 03:27:17
【问题描述】:

我遇到了问题,我不得不承认我没有找到任何解决方案。 我实际上正在开发一些功能测试,而工厂正在阻止我。

首先,我尝试向工厂添加一个名为“Tasklist”的实体,其中包含一个或多个“部分”,其中包含一个或多个“动作”。 我有 3 级深度关系。

这是我的工厂:

    $factory->define(\App\V2\Models\Tasklist::class, function (\Faker\Generator $faker) {
    return [
        'id_course'        => \App\V2\Models\Program::all()->random(1)->id,
        'id_event'         => \App\V2\Models\Stage::all()->random(1)->id,
        'id_course_rounds' => \App\V2\Models\ProgramRound::all()->random(1)->id,
        'name'             => $faker->word,
        'display_name'     => $faker->word,
        'color'            => 0,
        'key'              => str_random(16),
        'auto_active'      => 1,
        'status'           => 1,
    ];
});

$factory->define(\App\V2\Models\TasklistSection::class, function (\Faker\Generator $faker) {
    return [
        'id_tasklist' => function(){
            return factory(\App\V2\Models\Tasklist::class)->create()->id;
        },
        'number'      => 1,
        'title'       => $faker->word,
        'text'        => $faker->text(100),
        'status'      => 1
    ];
});

$factory->define(\App\V2\Models\TasklistAction::class, function(\Faker\Generator $faker) {
    return [
        'id_tasklists_section' => factory(\App\V2\Models\TasklistSection::class)->create()->id,
        'number' => rand(1, 10),
        'title' => $faker->word,
        'percent' => $faker->numberBetween(0, 100),
        'status' => 1
    ];
});

在我的测试课程中,我试图通过一个操作生成一个包含 1 个部分的任务列表。我发现的唯一方法实际上是这样的:

$task = factory(Tasklist::class, 2)->create()
            ->each(function($t){
               $t->sections()->save(factory(TasklistSection::class)->create()
                   ->each(function($s){
                     $s->actions()->save(factory(TasklistAction::class)->create());
                   })
               );
            });

对于这段代码,如果我删除第二个,它会起作用,我得到 2 个任务列表,每个 1 部分。事实上,每一个都让我感到不安。

我只想创建一个任务列表,其中包含一个或多个部分,其中包含一个或多个操作。

但是 each 只接受 Collection 输入,save 方法只接受模型输入而不接受集合。

有人知道如何处理吗?

【问题讨论】:

  • 您找到解决方案了吗?
  • 是的,我将每个工厂单独放置,并返回父容器的 id。任务列表工厂返回 id,然后我使用此任务列表 id 创建 2 个部分,然后使用该部分创建 5 个操作等...

标签: php oop laravel laravel-5


【解决方案1】:

一种方法可以是: 创建带有部分的任务并将它们存储在变量中,然后遍历每个任务部分并向其添加操作,如下所示:

$tasklist = factory(App\Tasklist::class)->create();
$tasklist->sections()->saveMany(factory(App\TasklistSection::class, 3)->make());

foreach ($tasklist->sections as $section){
  $section->actions()->saveMany(factory(App\TasklistAction::class, 3)->make());
}

这将按预期工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-08
    • 2019-04-01
    • 2021-07-08
    • 2021-03-11
    • 2015-10-21
    • 1970-01-01
    • 2021-06-29
    • 2014-10-27
    相关资源
    最近更新 更多