Как вставить с помощью Eloquant многоуровневую запись?

#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