Я пытаюсь вставить записи с отношениями OneToMany-ManyToOne, но получаю ошибку.
Expected argument of type "string", "App\Entity\Question" given.
У меня есть следующие сущности question и answer.
class Question
{
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type = "integer")
*/
private $id;
/**
* @ORM\Column(type = "text")
*/
private $title;
/**
* @ORM\OneToMany(targetEntity = "App\Entity\Answer", mappedBy = "question", orphanRemoval=true)
*/
private $answers;
public function __construct()
{
$this->answers = new ArrayCollection();
}
public function getId(): ?int
{
return $this->id;
}
public function getTitle(): ?string
{
return $this->title;
}
public function setTitle(string $title): self
{
$this->title = $title;
return $this;
}
/**
* @return Collection|Answer[]
*/
public function getAnswers(): Collection
{
return $this->answers;
}
public function addAnswer(Answer $answer): self
{
if (!$this->answers->contains($answer)) {
$this->answers[] = $answer;
$answer->setQuestion($this);
}
return $this;
}
public function removeAnswer(Answer $answer): self
{
if ($this->answers->contains($answer)) {
$this->answers->removeElement($answer);
if ($answer->getQuestion() === $this) {
$answer->setQuestion(null);
}
}
return $this;
}
}
Сущность Answer
class Answer
{
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type = "integer")
*/
private $id;
/**
* @ORM\Column(type = "text")
*/
private $text;
/**
* @ORM\Column(type = "boolean")
*/
private $is_correct;
/**
* @ORM\ManyToOne(targetEntity = "App\Entity\Question", inversedBy = "answers")
* @ORM\JoinColumn(nullable=false)
*/
private $question;
public function getId(): ?int
{
return $this->id;
}
public function getText(): ?string
{
return $this->text;
}
public function setText(string $text): self
{
$this->text = $text;
return $this;
}
public function getIsCorrect(): ?bool
{
return $this->is_correct;
}
public function setIsCorrect(bool $is_correct): self
{
$this->is_correct = $is_correct;
return $this;
}
public function getQuestion(): ?question
{
return $this->question;
}
public function setQuestion(?Question $question): self
{
$this->question = $question;
return $this;
}
}
Моя форма
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('title', EntityType::class, array(
'class' => Question::class,
'choice_label' => 'title',
'label' => 'Question'
));
$builder
->add('answers', CollectionType::class, array(
'entry_type' => AnswerType::class,
'entry_options' => array('label' => false),
'allow_add' => true,
'by_reference' => false,
));
$builder
->add('create', SubmitType::class, ['label' => 'Add', 'attr' => ['class' => 'btn btn-primary']]);
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => Question::class
]);
}
Мой фрагмент контроллера
$question = new Question();
$answer = new Answer();
$question->addAnswer($answer);
$form1 = $this->createForm(QuestionAnswerType::class, $question);
$form1->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$em = $this->getDoctrine()->getManager();
$em->persist($question);
$em->flush();
}
Указатель ошибки в следующей строке
$form1->handleRequest($request);
Я знаю, что у меня проблема с контроллером, но не знаю, как ее решить.
Я не понимаю, как правильно вставлять записи с отношениями OneToMany-ManyToOne. Не могли бы вы помочь мне?




Я думаю, что причина, по которой вы видите эту ошибку, связана с тем, что в вашем классе Question вы определили поле title как текстовый тип (@ORM\Column(type = "text")).
Однако в вашей форме вы определили поле формы title как EntityType, поэтому я думаю, что вы видите эту ошибку.
Вы можете исправить это, изменив отображение базы данных поля заголовка в вашем классе Questionили, вы можете изменить свою форму, чтобы использовать TextType вместо EntityType
Надеюсь это поможет
Вы должны взглянуть на ответ Капила, я думаю, это правильный путь.
Вы должны внести изменения в двух местах.
1) Первое изменение в классе "Вопрос"
/**
* @ORM\Column(type = "string")
*/
private $title;
2) Во-вторых, в вашем классе формы замените «EntityType :: class» на «TextType :: class» и удалите атрибуты «class» и «choice_label» из заголовка.
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('title', TextType::class, array(
'label' => 'Question'
));
..... your other code ...
}
Я понял. Но мне нужно использовать EntityType.
EntityType используется только тогда, когда у вас есть связь с другой таблицей. Здесь поле «заголовок» ни с чем не связано, это простой текстовый тип.
У меня есть отношения OneToMany-ManyToOne между таблицами вопрос и ответ.
Истинный. Для этого вы использовали "частные ответы $;" . Столбец "заголовок" не связан с другой таблицей. Это независимая колонка. Надеюсь, ты понял. :)
Что я должен использовать вместо заголовка для EntityType?
Похоже, вам нужен TextType, как предложил @temp.
Если вы хотите использовать EntityType, это означает, что вы связываете данные с какой-то другой таблицей. Возьмем пример штата округа. В таблице состояний есть поле countryId, которое можно связать с таблицей страны. Только это поле countryId можно использовать как EntityType. Надеюсь, ты понял.
В классе Вопрос __toString функция отсутствует
public function __toString()
{
return $this->property-to-show;
}
Я изменил тип объекта как «строку», но все равно получаю ошибку.