Я хочу добавить новый тег в свой bdd. С symfony я сделал: crud. В моем теге объекта у меня есть столбец с именем Language. Это отношение manyToOne к объекту Language.
В моей форме я хочу позволить пользователю выбирать между двумя языками, но я не хочу позволять им выбирать несколько языков. Но когда я проверяю рендеринг, у меня возникает проблема:
'Сущность типа «Doctrine \ Common \ Collections \ ArrayCollection», переданная в поле выбора, должна управляться. Может быть, вы забыли сохранить его в диспетчере сущностей? '
вот мой код:
<?php
namespace App\Entity;
use App\Repository\TagRepository;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity(repositoryClass=TagRepository::class)
*/
class Tag
{
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\Column(type="string", length=255)
*/
private $name;
/**
* @ORM\ManyToOne(targetEntity=Language::class, inversedBy="tag", cascade={"persist","remove"})
*/
private $language;
/**
* @ORM\ManyToMany(targetEntity=Video::class, mappedBy="tags", cascade={"persist","remove"})
*/
private $video;
public function __construct()
{
$this->language= new ArrayCollection();
$this->video = new ArrayCollection();
}
public function getId(): ?int
{
return $this->id;
}
public function getName(): ?string
{
return $this->name;
}
public function setName(string $name): self
{
$this->name = $name;
return $this;
}
/**
* @return Collection|Language[]
*/
public function getLanguage(): Collection
{
return $this->language;
}
public function addLanguage(Language $language): self
{
if (!$this->language->contains($language)) {
$this->language[] = $language;
$language->setTag($this);
}
return $this;
}
public function removeLanguage(Language $language): self
{
if ($this->language->contains($language)) {
$this->language->removeElement($language);
// set the owning side to null (unless already changed)
if ($language->getTag() === $this) {
$language->setTag(null);
}
}
return $this;
}
/**
* @return Collection|Video[]
*/
public function getVideo(): Collection
{
return $this->video;
}
public function addVideo(Video $video): self
{
if (!$this->video->contains($video)) {
$this->video[] = $video;
}
return $this;
}
public function removeVideo(Video $video): self
{
if ($this->video->contains($video)) {
$this->video->removeElement($video);
}
return $this;
}
}
<?php
namespace App\Entity;
use App\Repository\LanguageRepository;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity(repositoryClass=LanguageRepository::class)
*/
class Language
{
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\Column(type="string", length=255)
*/
private $name;
/**
* @ORM\OneToMany(targetEntity=Tag::class, mappedBy="language", cascade={"persist","remove"})
*/
private $tag;
public function getId(): ?int
{
return $this->id;
}
public function getName(): ?string
{
return $this->name;
}
public function setName(string $name): self
{
$this->name = $name;
return $this;
}
public function getTag(): ?Tag
{
return $this->tag;
}
public function setTag(?Tag $tag): self
{
$this->tag = $tag;
return $this;
}
}
и моя форма:
<?php
namespace App\Form;
use App\Entity\Language;
use App\Entity\Tag;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
class TagType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('name')
->add('language', EntityType::class, ['class'=>Language::class,
'choice_label'=>'name',
'multiple'=>false,
'expanded' => true,])
;
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => Tag::class,
]);
}
}
Если я поставлю «несколько» в значение true, проблем не возникнет, но пользователь может выбрать 2 языка, но я хочу, чтобы они выбирали только один язык. Спасибо!