php - 教义 - 带有额外列的关联表,插入问题
问题描述
我为自己创建了一个关联表,因为我需要在该表中添加一个额外的列,但是当我尝试发送表单时,我得到了这个异常:
关联字段“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”,但是当我尝试插入时,它会崩溃
你知道如何解决吗?
谢谢!
解决方案
我不确定你能做这样的事情。
->add('fonctionnalites', EntityType::class, [
'class' => Fonctionnalite::class,
'choice_label' => 'nom',
'multiple' => true,
'required' => false,
'label' => "Fonctionnalité.s lié.s avec ce profil",
])
App\Entity\ProfilFonctionnalite
您的 Profile 实体有一个名为 $fonctionnalites 的字段,其中包含注释中定义的数组。因此,您的表单必须将数组类型的对象传递App\Entity\ProfilFonctionnalite
给您的 Profil 对象。
您可以做的是使用映射的属性并在控制器中添加行为。(https://symfony.com/doc/current/reference/forms/types/entity.html#mapped)
推荐阅读
- c# - 来自 JSON 提要的 FullCalendar 事件未显示
- python - 如何删除数据框中的“无穷大”值?
- c++ - 有没有办法让这个排序算法具有线性时间复杂度?
- python - 散点图和可能的 ML 模型的见解可用于预测 Y 值
- python - 如何使用 tf.data.Dataset api 训练 keras.concatenate 模型?
- node-red - Node-red http 响应如何重定向到以 msg.payload 作为查询字符串的 URL
- css - CSS 不适用于 AngularJS 注入的 HTML
- java - 为什么我的浮点类型转换表达式返回两个不同的值?
- asp.net-mvc - 一个视图页面中的多个表单
- google-sheets - 使用查询时如何引用单元格值