我创建了一个关联表,因为我需要向该表添加一个额外的列,但是当我尝试发送表单时,却遇到了这个异常:
关联字段“ App \ Entity \ Profil#$ fonctionnalites”的类型为“ App \ Entity \ ProfilFonctionnalite”的期望值,取而代之的是“ App \ Entity \ Fonctionnalite”。
我使用了命令doctrine:schema:validate
,并且说说我的数据库和映射是正确的。
我的体系结构就像:Profil->Fonctionnalité(ManyToMany) 因此,我创建了ProfilFonctionnalite来链接它们。
我的Profil实体:
/**
* @ORM\Entity(repositoryClass="App\Repository\ProfilRepository")
*/
class Profil extends AbstractEntity
{
use DateTrait;
use UidTrait;
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
public $id;
/**
* @ORM\Column(type="string", length=255)
*/
public $code;
/**
* @ORM\Column(type="string", length=255)
*/
public $nom;
/**
* @ORM\OneToMany(targetEntity="App\Entity\Utilisateur", mappedBy="profil")
*/
private $utilisateurs;
/**
* @ORM\OneToMany(targetEntity="App\Entity\ProfilFonctionnalite", mappedBy="profils", cascade={"persist", "remove"})
*/
protected $fonctionnalites;
public function __construct()
{
$this->utilisateurs = new ArrayCollection();
$this->fonctionnalites = new ArrayCollection();
}
public function __toString()
{
return (string)$this->nom;
}
public function getId(): ?int
{
return $this->id;
}
public function getCode(): ?string
{
return $this->code;
}
public function setCode(string $code): self
{
$this->code = $code;
return $this;
}
public function getNom(): ?string
{
return $this->nom;
}
public function setNom(string $nom): self
{
$this->nom = $nom;
return $this;
}
/**
* @return Collection|Utilisateur[]
*/
public function getUtilisateurs(): Collection
{
return $this->utilisateurs;
}
public function addUtilisateur(Utilisateur $utilisateur): self
{
if (!$this->utilisateurs->contains($utilisateur)) {
$this->utilisateurs[] = $utilisateur;
$utilisateur->setIdProfil($this);
}
return $this;
}
public function removeUtilisateur(Utilisateur $utilisateur): self
{
if ($this->utilisateurs->contains($utilisateur)) {
$this->utilisateurs->removeElement($utilisateur);
// set the owning side to null (unless already changed)
if ($utilisateur->getIdProfil() === $this) {
$utilisateur->setIdProfil(null);
}
}
return $this;
}
public function addFonctionnalites(Fonctionnalite $fonctionnalite): self {
if (!$this->fonctionnalites->contains($fonctionnalite)) {
$this->fonctionnalites[] = $fonctionnalite;
$fonctionnalite->addProfil($this);
}
return $this;
}
/**
* @param ArrayCollection $fonctionnalites
* @return Profil
*/
public function setFonctionnalites(ArrayCollection $fonctionnalites): Profil
{
$this->fonctionnalites = $fonctionnalites;
return $this;
}
/**
* @return Collection|Fonctionnalite[]
*/
public function getFonctionnalites(): Collection
{
return $this->fonctionnalites;
}
}
我的功能实体:
**
* @ORM\Entity(repositoryClass="App\Repository\FonctionnalitRepository")
*/
class Fonctionnalite extends AbstractEntity
{
use DateTrait;
use UidTrait;
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
public $id;
/**
* @ORM\Column(type="string", length=255)
*/
public $nom;
/**
* @ORM\ManyToMany(targetEntity="App\Entity\Utilisateur", mappedBy="fonctionnalites")
*/
public $utilisateurs;
/**
* @ORM\Column(type="string", length=255)
*/
public $route;
/**
* @ORM\Column(type="integer")
*/
public $ordre;
/**
* @ORM\Column(type="text")
*/
public $icone;
/**
* @ORM\ManyToOne(targetEntity="App\Entity\Fonctionnalite", inversedBy="fonctionnalite_pair")
*/
private $fonctionnalite;
/**
* @ORM\OneToMany(targetEntity="App\Entity\Fonctionnalite", mappedBy="fonctionnalite")
*/
private $fonctionnalite_pair;
/**
* @ORM\OneToMany(targetEntity="App\Entity\ProfilFonctionnalite", mappedBy="fonctionnalites")
*/
protected $profils;
public function __construct()
{
$this->utilisateurs = new ArrayCollection();
$this->fonctionnalite_pair = new ArrayCollection();
$this->profils = new ArrayCollection();
}
public function __toString()
{
return (string)$this->fonctionnalite;
}
public function getId(): ?int
{
return $this->id;
}
public function getNom(): ?string
{
return $this->nom;
}
public function setNom(string $nom): self
{
$this->nom = $nom;
return $this;
}
/**
* @return Collection|Utilisateur[]
*/
public function getUtilisateurs(): Collection
{
return $this->utilisateurs;
}
public function addUtilisateur(Utilisateur $utilisateur): self
{
if (!$this->utilisateurs->contains($utilisateur)) {
$this->utilisateurs[] = $utilisateur;
$utilisateur->addFonctionnalite($this);
}
return $this;
}
public function removeUtilisateur(Utilisateur $utilisateur): self
{
if ($this->utilisateurs->contains($utilisateur)) {
$this->utilisateurs->removeElement($utilisateur);
$utilisateur->removeFonctionnalite($this);
}
return $this;
}
public function getRoute(): ?string
{
return $this->route;
}
public function setRoute(string $route): self
{
$this->route = $route;
return $this;
}
public function getOrdre(): ?int
{
return $this->ordre;
}
public function setOrdre(int $ordre): self
{
$this->ordre = $ordre;
return $this;
}
public function getIcone(): ?string
{
return $this->icone;
}
public function setIcone(string $icone): self
{
$this->icone = $icone;
return $this;
}
public function getFonctionnalite(): ?self
{
return $this->fonctionnalite;
}
public function setFonctionnalite(?self $fonctionnalite): self
{
$this->fonctionnalite = $fonctionnalite;
return $this;
}
/**
* @return Collection|self[]
*/
public function getFonctionnalitePair(): Collection
{
return $this->fonctionnalite_pair;
}
public function addFonctionnalitePair(self $fonctionnalitePair): self
{
if (!$this->fonctionnalite_pair->contains($fonctionnalitePair)) {
$this->fonctionnalite_pair[] = $fonctionnalitePair;
$fonctionnalitePair->setFonctionnalite($this);
}
return $this;
}
public function removeFonctionnalitePair(self $fonctionnalitePair): self
{
if ($this->fonctionnalite_pair->contains($fonctionnalitePair)) {
$this->fonctionnalite_pair->removeElement($fonctionnalitePair);
// set the owning side to null (unless already changed)
if ($fonctionnalitePair->getFonctionnalite() === $this) {
$fonctionnalitePair->setFonctionnalite(null);
}
}
return $this;
}
public function getProfil(): Collection
{
return $this->profils;
}
public function addProfil(Profil $profil): self
{
$this->profils->add($profil);
return $this;
}
/**
* @param ArrayCollection $profils
* @return Fonctionnalite
*/
public function setProfils(ArrayCollection $profils): Fonctionnalite
{
$this->profils = $profils;
return $this;
}
}
和我的ProfilFonctionnalite实体:
/**
* @ORM\Entity(repositoryClass="App\Repository\ProfilFonctionnaliteRepository")
*/
class ProfilFonctionnalite extends AbstractEntity
{
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\ManyToOne(targetEntity="App\Entity\Profil", cascade={"persist", "remove"}, inversedBy="fonctionnalites")
* @ORM\JoinColumn(name="profil_id", referencedColumnName="id", nullable=false)
*/
private $profils;
/**
* @ORM\ManyToOne(targetEntity="App\Entity\Fonctionnalite", cascade={"persist", "remove"}, inversedBy="profils")
* @ORM\JoinColumn(name="fonctionnalite_id", referencedColumnName="id", nullable=false)
*/
private $fonctionnalites;
/**
* @ORM\Column(type="smallint")
*/
private $niveau_droit;
/**
* ProfilFonctionnalite constructor.
* @param $profils
* @param $fonctionnalites
*/
public function __construct($profils, $fonctionnalites)
{
$this->profils = $profils;
$this->fonctionnalites = $fonctionnalites;
}
public function getId(): ?int
{
return $this->id;
}
public function getProfils(): Profil
{
return $this->profils;
}
public function setProfil(Profil $profil): self
{
$this->profils = $profil;
return $this;
}
public function getFonctionnalites(): ?Fonctionnalite
{
return $this->fonctionnalites;
}
public function setFonctionnalite(Fonctionnalite $fonctionnalite): self
{
$this->fonctionnalites = $fonctionnalite;
return $this;
}
public function getNiveauDroit(): ?int
{
return $this->niveau_droit;
}
public function setNiveauDroit(int $niveau_droit): self
{
$this->niveau_droit = $niveau_droit;
return $this;
}
}
和我的ProfilType(窗体):
class ProfilType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('code', TextType::class, [
'required' => true,
'label' => "Code du profil"
])
->add('nom', TextType::class, [
'required' => true,
'label' => "Nom du profil"
])
->add('fonctionnalites', EntityType::class, [
'class' => Fonctionnalite::class,
'choice_label' => 'nom',
'multiple' => true,
'required' => false,
'label' => "Fonctionnalité.s lié.s avec ce profil",
])
->add('Enregistrer', SubmitType::class, [
'attr' => [
'class' => 'btn btn-success w-100'
],
])
;
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => Profil::class,
]);
}
}
在我的表单中,我可以正确找到我的“ Fonctionnalite”,但是当我尝试插入时,它会崩溃
您知道如何解决吗?
谢谢!
答案 0 :(得分:0)
我不确定您可以做这样的事情。
->add('fonctionnalites', EntityType::class, [
'class' => Fonctionnalite::class,
'choice_label' => 'nom',
'multiple' => true,
'required' => false,
'label' => "Fonctionnalité.s lié.s avec ce profil",
])
您的Profil实体有一个名为$ fonctionnalites的字段,该字段包含注释中定义的App\Entity\ProfilFonctionnalite
数组。因此,您的表单必须将App\Entity\ProfilFonctionnalite
数组类型的对象传递给Profil对象。
您可以做的是使用映射的属性,并在控制器中添加行为。 (https://symfony.com/doc/current/reference/forms/types/entity.html#mapped)