【发布时间】:2020-02-21 14:37:31
【问题描述】:
我为自己创建了一个关联表,因为我需要在该表中添加一个额外的列,但是当我尝试发送表单时,我得到了这个异常:
关联字段“App\Entity\Profil#$fonctionnalites”的类型为“App\Entity\ProfilFonctionnalite”的预期值,改为“App\Entity\Fonctionnalite”。
我使用了命令doctrine:schema:validate 并且教义告诉我我的数据库和我的映射是正确的。
我的架构是这样的:Profil -> Fonctionnalité (ManyToMany) 所以我创建了 ProfilFonctionnalite 来链接它们。
我的个人资料实体:
/**
* @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;
}
}
我的 Fonctionnalite 实体:
**
* @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”,但是当我尝试插入时,它会崩溃
你知道怎么解决吗?
谢谢!
【问题讨论】:
-
'class' => Fonctionnalite::class,'class' => ProfilFonctionnalite::class, 因为Profil->fonctionnalites是ProfilFonctionnalite -
当我这样做时,我的选择中不再显示“Fonctionnalite”...
-
Profil 有很多功能。这意味着在您的 FormType 中,您应该使用 CollectionType 而不是 EntityType。因为,EntityType 将返回一个实体,但您期望一个集合
标签: php symfony doctrine-orm annotations mapping