[英]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,
]);
}
我感謝您的幫助,這對我來說是無價的!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.