簡體   English   中英

與屬性的多對多關系 -> 表單集合 -> BDD

[英]ManyToMany relation with attributes -> form Collection -> BDD

兩天以來,我一直在研究具有 OneToMany-ManyToOne-OneToMany 屬性的多對多關系的主題。

我有一個合作伙伴實體和一個模塊實體。 一個合作伙伴可以有多個模塊,一個模塊屬於多個合作伙伴。 所以我有一個 ManyToMany 關系,但我想在 PartnerModule 連接表中添加一個 is_active 字段。 所以我總結了我所看到的一切,我需要創建 3 個具有關系的實體。

我做了什么,我給你代碼。 因此,在我的 PartenaireType 中,我想嵌套 PartenaireModule 表單,該表單是通過 EntityType 檢索的模塊列表。 在添加合作伙伴后,我不可能成功地顯示數據,甚至更不可能將它們保存在我的數據庫中。 '我錯過了一些重要的東西,但我已經嘗試了很多我不知道的東西,我會回到你的幫助下:)

我的實體Partenaire


namespace App\Entity;

use App\Repository\PartenaireRepository;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;

#[ORM\Entity(repositoryClass: PartenaireRepository::class)]
class Partenaire
{
    #[ORM\Id]
    #[ORM\GeneratedValue]
    #[ORM\Column]
    private ?int $id = null;

    #[ORM\Column(length: 80)]
    private ?string $nom = null;

    #[ORM\Column]
    private ?bool $statut = true;

    #[ORM\OneToMany(mappedBy: 'partenaires', targetEntity: User::class)]
    private Collection $users;

    #[ORM\OneToMany(mappedBy: 'partenaire', targetEntity: Structure::class)]
    private Collection $structures;

    #[ORM\OneToMany(mappedBy: 'Partenaires', targetEntity: PartenaireModule::class)]
    private Collection $partenaireModules;

    public function __construct()
    {
        $this->users = new ArrayCollection();
        $this->structures = new ArrayCollection();
        $this->partenaireModules = new ArrayCollection();
    }

    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;
    }

    public function isStatut(): ?bool
    {
        return $this->statut;
    }

    public function setStatut(bool $statut): self
    {
        $this->statut = $statut;

        return $this;
    }


    public function __toString()
    {
        return $this-> nom;
    }

    /**
     * @return Collection<int, User>
     */
    public function getUsers(): Collection
    {
        return $this->users;
    }

    public function addUser(User $user): self
    {
        if (!$this->users->contains($user)) {
            $this->users->add($user);
            $user->setPartenaires($this);
        }

        return $this;
    }

    public function removeUser(User $user): self
    {
        if ($this->users->removeElement($user)) {
            // set the owning side to null (unless already changed)
            if ($user->getPartenaires() === $this) {
                $user->setPartenaires(null);
            }
        }

        return $this;
    }

    /**
     * @return Collection<int, Structure>
     */
    public function getStructures(): Collection
    {
        return $this->structures;
    }

    public function addStructure(Structure $structure): self
    {
        if (!$this->structures->contains($structure)) {
            $this->structures->add($structure);
            $structure->setPartenaire($this);
        }

        return $this;
    }

    public function removeStructure(Structure $structure): self
    {
        if ($this->structures->removeElement($structure)) {
            // set the owning side to null (unless already changed)
            if ($structure->getPartenaire() === $this) {
                $structure->setPartenaire(null);
            }
        }

        return $this;
    }

    /**
     * @return Collection<int, PartenaireModule>
     */
    public function getPartenaireModules(): Collection
    {
        return $this->partenaireModules;
    }

    public function addPartenaireModule(PartenaireModule $partenaireModule): self
    {
        if (!$this->partenaireModules->contains($partenaireModule)) {
            $this->partenaireModules->add($partenaireModule);
            $partenaireModule->setPartenaires($this);
        }

        return $this;
    }

    public function removePartenaireModule(PartenaireModule $partenaireModule): self
    {
        if ($this->partenaireModules->removeElement($partenaireModule)) {
            // set the owning side to null (unless already changed)
            if ($partenaireModule->getPartenaires() === $this) {
                $partenaireModule->setPartenaires(null);
            }
        }

        return $this;
    }
}

我的實體模塊


namespace App\Entity;

use App\Repository\ModuleRepository;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;

#[ORM\Entity(repositoryClass: ModuleRepository::class)]
class Module
{
    #[ORM\Id]
    #[ORM\GeneratedValue]
    #[ORM\Column]
    private ?int $id = null;

    #[ORM\Column(length: 250)]
    private ?string $nom = null;

    #[ORM\Column]
    private ?bool $statut = null;

    #[ORM\OneToMany(mappedBy: 'Modules', targetEntity: PartenaireModule::class)]
    private Collection $partenaireModules;

    public function __construct()
    {
        $this->partenaireModules = new ArrayCollection();
    }

    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;
    }

    public function isStatut(): ?bool
    {
        return $this->statut;
    }

    public function setStatut(bool $statut): self
    {
        $this->statut = $statut;

        return $this;
    }

    /**
     * @return Collection<int, PartenaireModule>
     */
    public function getPartenaireModules(): Collection
    {
        return $this->partenaireModules;
    }

    public function addPartenaireModule(PartenaireModule $partenaireModule): self
    {
        if (!$this->partenaireModules->contains($partenaireModule)) {
            $this->partenaireModules->add($partenaireModule);
            $partenaireModule->setModules($this);
        }

        return $this;
    }

    public function removePartenaireModule(PartenaireModule $partenaireModule): self
    {
        if ($this->partenaireModules->removeElement($partenaireModule)) {
            // set the owning side to null (unless already changed)
            if ($partenaireModule->getModules() === $this) {
                $partenaireModule->setModules(null);
            }
        }

        return $this;
    }
}

我的實體 PartenaireModule


namespace App\Entity;

use App\Repository\PartenaireModuleRepository;
use Doctrine\ORM\Mapping as ORM;

#[ORM\Entity(repositoryClass: PartenaireModuleRepository::class)]
class PartenaireModule
{
    #[ORM\Id]
    #[ORM\GeneratedValue]
    #[ORM\Column]
    private ?int $id = null;

    #[ORM\Column]
    private ?bool $is_active = null;

    #[ORM\ManyToOne(inversedBy: 'partenaireModules')]
    private ?Partenaire $Partenaires = null;

    #[ORM\ManyToOne(inversedBy: 'partenaireModules')]
    private ?Module $Modules = null;

    public function getId(): ?int
    {
        return $this->id;
    }

    public function isIsActive(): ?bool
    {
        return $this->is_active;
    }

    public function setIsActive(bool $is_active): self
    {
        $this->is_active = $is_active;

        return $this;
    }

    public function getPartenaires(): ?Partenaire
    {
        return $this->Partenaires;
    }

    public function setPartenaires(?Partenaire $Partenaires): self
    {
        $this->Partenaires = $Partenaires;

        return $this;
    }

    public function getModules(): ?Module
    {
        return $this->Modules;
    }

    public function setModules(?Module $Modules): self
    {
        $this->Modules = $Modules;

        return $this;
    }
}

我的PartenaireType(主要)


namespace App\Form;

use App\Entity\Partenaire;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\CollectionType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;



class PartenaireType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options): void
    {
        $builder
            ->add('nom')
            ->add('statut')
            ->add('partenaireModules', CollectionType::class, [
                'entry_type' => PartenaireModuleType::class,
                'by_reference' => false,
                'allow_add' => true,
                'allow_delete' => true,
            ])
            //->add('modules', EntityType::class, [
            //    'class' => Modules::class,
            //    'choice_label' => 'nom',
            //    'label' => 'Modules par défaut',
            //    'expanded' => true,
            //    'multiple' => true,
            //    'property_path' => PartenairesModules::class,
             //])
             ;
    }

    public function configureOptions(OptionsResolver $resolver): void
    {
        $resolver->setDefaults([
            'data_class' => Partenaire::class,
        ]);
    }
}

我的表單 PartenaireModuleType(包括模塊)


namespace App\Form;

use App\Entity\PartenaireModule;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use App\Entity\Module;

class PartenaireModuleType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options): void
    {
        $builder
            ->add('modules', EntityType::class, [
                  'class' => Module::class,
                  'choice_label' => 'nom',
                  'label' => 'Modules par défaut',
                  'expanded' => true,
                  'multiple' => true,
                 ])
        ;
    }

    public function configureOptions(OptionsResolver $resolver): void
    {
        $resolver->setDefaults([
            'data_class' => PartenaireModule::class,
        ]);
    }
}

我的 Add Partenaire 表單的 Twig 視圖我設法顯示模塊,但我不確定這是否適合我的情況。 特別是當我檢查並保存時,我得到一個錯誤。

    {{ form_row(form.nom) }}
    {{ form_row(form.statut) }}
    {{ (dump(form.partenaireModules.vars.prototype.modules)) }}
   {{ form_row(form.partenaireModules.vars.prototype.modules) }}



    
    <button class="btn">{{ button_label|default('Save') }}</button>
{{ form_end(form) }}

保存我的 Partenaire 時出錯:

Expected argument of type "?App\Entity\Module", "Doctrine\Common\Collections\ArrayCollection" given at property path "modules".
App\Entity\PartenaireModule::setModules(): Argument #1 ($Modules) must be of type ?App\Entity\Module, Doctrine\Common\Collections\ArrayCollection given, called in /Users/marinepro/Sites/htdocs/ecf-2022/vendor/symfony/property-access/PropertyAccessor.php on line 591

是的,我同意錯誤很明顯,但我真的找不到解決方案。

完成我的 PartenaireController

    public function new(Request $request, PartenaireRepository $partenaireRepository): Response
    {
        $partenaire = new Partenaire();

        $form = $this->createForm(PartenaireType::class, $partenaire);
        $form->handleRequest($request);



        if ($form->isSubmitted() && $form->isValid()) {
            $partenaireRepository->add($partenaire, true);


            return $this->redirectToRoute('app_partenaire_index', [], Response::HTTP_SEE_OTHER);
        }

        return $this->renderForm('partenaire/new.html.twig', [
            'partenaire' => $partenaire,
            'form' => $form,
        ]);
    }

我感謝您的幫助,這對我來說是無價的!

對不起,我會盡量說清楚。 這就是我想要的在此處輸入圖像描述

我的合作伙伴創建表單,其中包括向該合作伙伴添加模塊。

我必須使用collectionType嗎? 如果是這樣,我無法得到想要的結果。 這已經是我的第一首曲目

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM