Я пытаюсь перебрать мою коллекцию, которая имеет вложенные коллекции, с функцией reject()
collection и вернуть исходную коллекцию с обновленными вложенными данными.
Так что это моя коллекция викторин
{
"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);
});
Я хочу вернуть коллекцию викторин с обновленными вопросами (без отклоненных вопросов), но я не могу найти правильный способ Совершено sh это. (если я возвращаю только переменную $ отфильтрованного, я получаю правильные отфильтрованные результаты, однако, если я попытаюсь вернуть ее в переменную $ quiz, фильтр не будет применен) Если я просто сделаю
return $quiz
, я получу ту же самую оригинальную коллекцию со всеми вопросами, как если бы я никогда не выполнял функцию reject()
.
Как мне сделать $quiz->questions = $filtered;
?