Доктрина - таблица ассоциации с дополнительным столбцом, проблема вставки - PullRequest
0 голосов
/ 25 октября 2019

Я создаю таблицу связей, потому что мне нужно было добавить дополнительный столбец в эту таблицу, но когда я пытаюсь отправить форму, я получаю следующее исключение:

Ожидаемое значение типа «App \»Entity \ ProfilFonctionnalite "для поля связи" App \ Entity \ Profil # $ fonctionnalites ", вместо него получено" 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;
    }

}

Моя сущность 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", но когда я пытаюсь вставить его, он вылетает

Знаете ли вы, какрешить это?

Спасибо!

1 Ответ

0 голосов
/ 25 октября 2019

Я не уверен, что вы можете сделать что-то подобное.

->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)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...