我为自己创建了一个关联表,因为我需要向该表添加一个额外的列,但当我尝试发送表单时,我得到了以下异常:
关联字段"App\Entity\Profile#$foctionnalites"的类型为"App\Entity\ProfileFoctionnalite"的预期值,得到的却是"App\实体\Foctionnalite."。
我使用了命令doctrine:schema:validate
,条令告诉我的数据库和映射是正确的。
我的架构是这样的:Profile->Foctionnalité(ManyToMany(所以我创建ProfileFoctionnalite来链接它们。
我的档案实体:
/**
* @ORMEntity(repositoryClass="AppRepositoryProfilRepository")
*/
class Profil extends AbstractEntity
{
use DateTrait;
use UidTrait;
/**
* @ORMId()
* @ORMGeneratedValue()
* @ORMColumn(type="integer")
*/
public $id;
/**
* @ORMColumn(type="string", length=255)
*/
public $code;
/**
* @ORMColumn(type="string", length=255)
*/
public $nom;
/**
* @ORMOneToMany(targetEntity="AppEntityUtilisateur", mappedBy="profil")
*/
private $utilisateurs;
/**
* @ORMOneToMany(targetEntity="AppEntityProfilFonctionnalite", 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;
}
}
我的基金实体:
**
* @ORMEntity(repositoryClass="AppRepositoryFonctionnalitRepository")
*/
class Fonctionnalite extends AbstractEntity
{
use DateTrait;
use UidTrait;
/**
* @ORMId()
* @ORMGeneratedValue()
* @ORMColumn(type="integer")
*/
public $id;
/**
* @ORMColumn(type="string", length=255)
*/
public $nom;
/**
* @ORMManyToMany(targetEntity="AppEntityUtilisateur", mappedBy="fonctionnalites")
*/
public $utilisateurs;
/**
* @ORMColumn(type="string", length=255)
*/
public $route;
/**
* @ORMColumn(type="integer")
*/
public $ordre;
/**
* @ORMColumn(type="text")
*/
public $icone;
/**
* @ORMManyToOne(targetEntity="AppEntityFonctionnalite", inversedBy="fonctionnalite_pair")
*/
private $fonctionnalite;
/**
* @ORMOneToMany(targetEntity="AppEntityFonctionnalite", mappedBy="fonctionnalite")
*/
private $fonctionnalite_pair;
/**
* @ORMOneToMany(targetEntity="AppEntityProfilFonctionnalite", 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;
}
}
我的ProfileFoctionnalite实体:
/**
* @ORMEntity(repositoryClass="AppRepositoryProfilFonctionnaliteRepository")
*/
class ProfilFonctionnalite extends AbstractEntity
{
/**
* @ORMId()
* @ORMGeneratedValue()
* @ORMColumn(type="integer")
*/
private $id;
/**
* @ORMManyToOne(targetEntity="AppEntityProfil", cascade={"persist", "remove"}, inversedBy="fonctionnalites")
* @ORMJoinColumn(name="profil_id", referencedColumnName="id", nullable=false)
*/
private $profils;
/**
* @ORMManyToOne(targetEntity="AppEntityFonctionnalite", cascade={"persist", "remove"}, inversedBy="profils")
* @ORMJoinColumn(name="fonctionnalite_id", referencedColumnName="id", nullable=false)
*/
private $fonctionnalites;
/**
* @ORMColumn(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;
}
}
我的ProfileType(表单(:
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,
]);
}
}
在我的表单中,我可以正确地找到我的"Foctionnalite",但当我尝试插入时,它会崩溃
你知道如何解决吗?
谢谢!
我不确定你能不能做这样的事情。
->add('fonctionnalites', EntityType::class, [
'class' => Fonctionnalite::class,
'choice_label' => 'nom',
'multiple' => true,
'required' => false,
'label' => "Fonctionnalité.s lié.s avec ce profil",
])
Profile实体有一个名为$foctionnalites的字段,该字段包含注释中定义的AppEntityProfilFonctionnalite
数组。因此,您的窗体必须将类型为AppEntityProfilFonctionnalite
的对象传递给您的Profile对象。
您可以使用映射的属性并在控制器中添加行为。(https://symfony.com/doc/current/reference/forms/types/entity.html#mapped)