【问题标题】:Laravel reject function on nested collection嵌套集合上的 Laravel 拒绝功能
【发布时间】:2020-02-16 02:35:13
【问题描述】:

我正在尝试使用集合 reject() 函数迭代包含嵌套集合的集合,并返回包含更新的嵌套数据的原始集合。

所以这是我的测验集合

{
 "id": 1,
 "title": "quiz 1",
 "questions": [
     {
         "id": 1,
         "quiz_id": 1,
         "question": "q1 - q1",
         "answers": [
             {
                 "id": 1,
                 "question_id": 1,
                 "answer": "answer to question 1"
             },
             {
                 "id": 2,
                 "question_id": 1,
                 "answer": "answer to question 1"
             }
         ]
     },
     {
         "id": 2,
         "quiz_id": 1,
         "question": "q1 - q2",
         "answers": [
             {
                 "id": 3,
                 "question_id": 2,
                 "answer": "answer to question 1"
             }
         ]
     }
 ]
}

现在我想遍历问题并拒绝那些已经回答并存在于结果集合中的问题。我通过使用reject() 函数来做到这一点

$quizResults = [
    {
        "id": 1,
        "user_id": 1,
        "quiz_id": 1,
        "question_id": 1,
        "answer_id": 1,
        "correct": 1,
        "created_at": null,
        "updated_at": null
    }
];

$filtered = $quiz->questions->reject(function ($value, $key) use ($quizResult) {
   return $quizResult->contains('question_id', $value->id);
});

我想返回带有更新问题的测验集合(不包括被拒绝的问题),但我似乎无法找出完成此任务的正确方法。 (如果我只返回 $filtered 变量,我会得到正确的过滤结果,但是如果我尝试将其放回 $quiz var,它将不会应用被拒绝的过滤器)。如果我只是这样做

return $quiz

我将获得与所有问题相同的原始集合,就好像我从未运行过 reject() 函数一样。

如何制作$quiz->questions = $filtered;

【问题讨论】:

  • 你能给我们一个$quizResult的例子吗?喜欢你的$quiz
  • @AndySong 我将其添加到编辑中,谢谢。

标签: laravel laravel-collection


【解决方案1】:

通过引用传递它

$filtered = $quiz->questions->reject(function ($value, $key) use (&$quizResult) {
   return $quizResult->contains('question_id', $value->id);
});

【讨论】:

  • 它仍然返回相同的原始 $quiz 并且没有应用拒绝功能
【解决方案2】:

这是重现问题的最少步骤,

    $quizResult = [
        0 => [
          'id' => 1,
          'user_id' => 1,
          'quiz_id' => 1,
          'question_id' => 1,
          'answer_id' => 1,
          'correct' => 1,
          'created_at' => null,
          'updated_at' => null,
        ],
    ];

    $quiz = [
        'id' => 1,
        'title' => 'quiz 1',
        'questions' => [
          0 => [
            'id' => 1,
            'quiz_id' => 1,
            'question' => 'q1 - q1',
            'answers' => [
              0 => [
                'id' => 1,
                'question_id' => 1,
                'answer' => 'answer to question 1',
              ],
              1 => [
                'id' => 2,
                'question_id' => 1,
                'answer' => 'answer to question 1',
              ],
            ],
          ],
          1 => [
            'id' => 2,
            'quiz_id' => 1,
            'question' => 'q1 - q2',
            'answers' => [
              0 => [
                'id' => 3,
                'question_id' => 2,
                'answer' => 'answer to question 1',
              ],
            ],
          ],
        ],
    ];

    $filtered = collect($quiz['questions'])->reject(function ($value) use ($quizResult) {
        return collect($quizResult)->contains('question_id', $value['id']);
    });
    $quiz['questions'] = $filtered;

    return $quiz;

这就是结果,

{
"id": 1,
"title": "quiz 1",
"questions": {
"1": {
"id": 2,
"quiz_id": 1,
"question": "q1 - q2",
"answers": [
  {
         "id": 3,
         "question_id": 2,
         "answer": "answer to question 1"
  }
 ]
}
}
}

我不明白你为什么说它会返回原始版本。

【讨论】:

  • 是的,这就是我想要实现的目标,问题是 return $quiz 只会返回两个问题而不应用被拒绝的过滤更改
  • @Mika 你能给我们一个$quizResult 的例子吗?喜欢你的$quiz
  • $quizResults = [ { “id”:1,“user_id”:1,“quiz_id”:1,“question_id”:1,“answer_id”:1,“正确”:1,“ created_at": null, "updated_at": null } ];
  • @Mika,你运行我提供的代码了吗?它会给你想要的,不会给你两个。
  • 是的,我运行了你的代码,仍然一样,如果我只返回 $filtered 我会得到一个答案,但如果我返回 $quiz 即使在完成你的代码之后我也会得到两个答案(换句话说回到原来的样子)
【解决方案3】:

我必须先取消设置 $quiz['questions'] 所以它是这样的

unset($quiz['questions']);
$quiz['questions'] = $filtered->flatten();
return $quiz;

结果符合预期:

{
    "id": 1,
    "title": "quiz 1",
    "questions": [
        {
            "id": 2,
            "quiz_id": 1,
            "question": "q1 - q2",
            "answers": [
                {
                    "id": 3,
                    "question_id": 2,
                    "answer": "answer to question 1"
                }
            ]
        }
    ]
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-19
    • 1970-01-01
    • 1970-01-01
    • 2017-08-03
    • 2016-12-14
    • 1970-01-01
    • 2021-08-25
    相关资源
    最近更新 更多