#php #laravel #eloquent
#php #laravel #eloquent
Вопрос:
Давайте рассмотрим, что у меня есть Quizzes
которые могут содержать Questions
, каждый из которых содержит несколько Propositions
. Поэтому у меня есть три модели: Quiz
, Question
и Proposition
. Предложения связаны с вопросами через сводную таблицу, которая содержит: id_question
, id_proposition
, is_correct
.
В сеялке я хотел бы вставить фиктивный тест, который можно было бы представить в YAML следующим образом:
title: A Quiz
questions:
- name: Animals
content: What's the difference between a duck?
propositions:
- text: The dog has two legs
is_correct: false
- text: One leg is both the same
is_correct: true
- text: Every duck has at least several teeth
is_correct: false
Традиционно в Laravel вам нужно разделить каждый шаг, например:
$quiz = new Quiz;
$quiz->name = "A Quiz";
$question = $quiz->questions()->create();
...
Есть ли более короткий способ иерархически создать новую запись, которая выглядела бы так:
Quiz::create([
'name' => 'A Quiz'
'questions' => [
Question::Create([
'name' => 'Animals',
'content' => "What's the difference between a duck?"
'propositions' => [
Proposition::Create(['content' => 'The dog has two legs']),
Proposition::Create(['content' => 'One leg is both the same'])
Proposition::Create(['content' => 'Every duck has at least several teeth'])
]
])
]
]
Комментарии:
1. я просто подумал, используя saveMany(). Quiz::create($quiz)-> questions()->create($question)-> propositions()-> saveMany( [ новое предложение([‘content’=> ‘value’]) ] ); но оставляю по 1 вопросу за раз
Ответ №1:
просто тестирование со статическими значениями :
$quiz = Quiz::create([
'name' => 'A quiz',
])->questions()->createMany([
['name' => 'animals', 'content' => 'animals content'],
['name' => 'fruits', 'content' => 'fruits content'],
])->map(function($value, $key){
$value->propositions()->createMany([
['content' => 'content 1'],
['content' => 'content 2'],
]);
});
я думаю, вы можете установить значения на основе значений индекса YAML (что-то вроде json) с помощью foreach