Symfony-多个-替换而不是添加

Symfony-多个-替换而不是添加,symfony,doctrine-orm,many-to-many,symfony5,Symfony,Doctrine Orm,Many To Many,Symfony5,如果你觉得我的问题很傻,我提前向你道歉,我是一个初学者,我已经搜索过了,但是我找不到答案 我们在一家工厂里。在这个工厂,每个工人可以有几个岗位,每个岗位可以有几个工人。所以我们有很多关系。问题是,当我向一个职位添加一名员工时,他并没有添加到该职位中已经存在的员工,而是替换了他!就好像一个岗位只能包含一名员工一样。 有人能告诉我我做错了什么,或者给我发送与这类问题相关的文档吗? 谢谢 这是相关代码 (岗位=岗位,操作员=工人) 在Post实体中: /** * @ORM\Many

如果你觉得我的问题很傻,我提前向你道歉,我是一个初学者,我已经搜索过了,但是我找不到答案

我们在一家工厂里。在这个工厂,每个工人可以有几个岗位,每个岗位可以有几个工人。所以我们有很多关系。问题是,当我向一个职位添加一名员工时,他并没有添加到该职位中已经存在的员工,而是替换了他!就好像一个岗位只能包含一名员工一样。 有人能告诉我我做错了什么,或者给我发送与这类问题相关的文档吗? 谢谢 这是相关代码

(岗位=岗位,操作员=工人)

在Post实体中:

     /**
     * @ORM\ManyToMany(targetEntity=Operateur::class, inversedBy="postes")
     * @ORM\JoinTable(name="poste_operateur")
     */
    private $operateurs;

     /**
     * @return Collection|Operateur[]
     */
    public function getOperateurs(): Collection
    {
        return $this->operateurs;
    }

    public function addOperateur(Operateur $operateur): self
    {
        if (!$this->operateurs->contains($operateur)) {
            $this->operateurs[] = $operateur;
            $operateur->addPoste($this);
        }

        return $this;
    }

    public function removeOperateur(Operateur $operateur): self
    {
        $this->operateurs->removeElement($operateur);
        $operateur->removePoste($this);

        return $this;
    }
/**
 * @ORM\ManyToMany(targetEntity=Poste::class, mappedBy="operateurs")
 */
private $postes;


/**
* @return Collection|Poste[]
*/
public function getPostes(): Collection
{
    return $this->postes;
}

public function addPoste(Poste $poste): self
{
    if (!$this->postes->contains($poste)) {
        $this->postes[] = $poste;
        $poste->addOperateur($this);
    }

    return $this;
}

public function removePoste(Poste $poste): self
{
    if ($this->postes->removeElement($poste)) {
        $poste->removeOperateur($this);
    }

    return $this;
}
/**
 * @Route("/{id}/new", name="poste_ope", methods={"GET", "POST"})
 */
public function addOpe(Request $request, Poste $poste): Response
{
    $form = $this->createForm(PosteType2::class, $poste);
    $form->handleRequest($request);

    if ($form->isSubmitted() && $form->isValid()) {
        $this->getDoctrine()->getManager()->flush();

        $this->addFlash(
            'success',
            "L'opérateur a bien été ajouté au poste {$poste->getNom()}  !"
        );
        return $this->redirectToRoute('operateur_index');
    }

    return $this->render('poste/addope.html.twig', [
        'poste' => $poste,
        'form' => $form->createView(),
    ]);
}
class PosteType2 extends AbstractType
{

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('operateurs', EntityType::class, [
                'class' => Operateur::class, 
                'label' => 'ajouter un opérateur à ce poste',
                'choice_label' => 'nom',
                'multiple' => true,
                'expanded' => true,
            ])
            ->add('save', SubmitType::class, [
                'label' => 'Enregistrer',
                'attr' => [
                    'class' => 'btn btn-primary'
                ]
            ]);
        ;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => Poste::class,
        ]);
    }
}
在操作员(工人)实体中:

     /**
     * @ORM\ManyToMany(targetEntity=Operateur::class, inversedBy="postes")
     * @ORM\JoinTable(name="poste_operateur")
     */
    private $operateurs;

     /**
     * @return Collection|Operateur[]
     */
    public function getOperateurs(): Collection
    {
        return $this->operateurs;
    }

    public function addOperateur(Operateur $operateur): self
    {
        if (!$this->operateurs->contains($operateur)) {
            $this->operateurs[] = $operateur;
            $operateur->addPoste($this);
        }

        return $this;
    }

    public function removeOperateur(Operateur $operateur): self
    {
        $this->operateurs->removeElement($operateur);
        $operateur->removePoste($this);

        return $this;
    }
/**
 * @ORM\ManyToMany(targetEntity=Poste::class, mappedBy="operateurs")
 */
private $postes;


/**
* @return Collection|Poste[]
*/
public function getPostes(): Collection
{
    return $this->postes;
}

public function addPoste(Poste $poste): self
{
    if (!$this->postes->contains($poste)) {
        $this->postes[] = $poste;
        $poste->addOperateur($this);
    }

    return $this;
}

public function removePoste(Poste $poste): self
{
    if ($this->postes->removeElement($poste)) {
        $poste->removeOperateur($this);
    }

    return $this;
}
/**
 * @Route("/{id}/new", name="poste_ope", methods={"GET", "POST"})
 */
public function addOpe(Request $request, Poste $poste): Response
{
    $form = $this->createForm(PosteType2::class, $poste);
    $form->handleRequest($request);

    if ($form->isSubmitted() && $form->isValid()) {
        $this->getDoctrine()->getManager()->flush();

        $this->addFlash(
            'success',
            "L'opérateur a bien été ajouté au poste {$poste->getNom()}  !"
        );
        return $this->redirectToRoute('operateur_index');
    }

    return $this->render('poste/addope.html.twig', [
        'poste' => $poste,
        'form' => $form->createView(),
    ]);
}
class PosteType2 extends AbstractType
{

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('operateurs', EntityType::class, [
                'class' => Operateur::class, 
                'label' => 'ajouter un opérateur à ce poste',
                'choice_label' => 'nom',
                'multiple' => true,
                'expanded' => true,
            ])
            ->add('save', SubmitType::class, [
                'label' => 'Enregistrer',
                'attr' => [
                    'class' => 'btn btn-primary'
                ]
            ]);
        ;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => Poste::class,
        ]);
    }
}
在PosteController中,向post添加运算符的方法:

     /**
     * @ORM\ManyToMany(targetEntity=Operateur::class, inversedBy="postes")
     * @ORM\JoinTable(name="poste_operateur")
     */
    private $operateurs;

     /**
     * @return Collection|Operateur[]
     */
    public function getOperateurs(): Collection
    {
        return $this->operateurs;
    }

    public function addOperateur(Operateur $operateur): self
    {
        if (!$this->operateurs->contains($operateur)) {
            $this->operateurs[] = $operateur;
            $operateur->addPoste($this);
        }

        return $this;
    }

    public function removeOperateur(Operateur $operateur): self
    {
        $this->operateurs->removeElement($operateur);
        $operateur->removePoste($this);

        return $this;
    }
/**
 * @ORM\ManyToMany(targetEntity=Poste::class, mappedBy="operateurs")
 */
private $postes;


/**
* @return Collection|Poste[]
*/
public function getPostes(): Collection
{
    return $this->postes;
}

public function addPoste(Poste $poste): self
{
    if (!$this->postes->contains($poste)) {
        $this->postes[] = $poste;
        $poste->addOperateur($this);
    }

    return $this;
}

public function removePoste(Poste $poste): self
{
    if ($this->postes->removeElement($poste)) {
        $poste->removeOperateur($this);
    }

    return $this;
}
/**
 * @Route("/{id}/new", name="poste_ope", methods={"GET", "POST"})
 */
public function addOpe(Request $request, Poste $poste): Response
{
    $form = $this->createForm(PosteType2::class, $poste);
    $form->handleRequest($request);

    if ($form->isSubmitted() && $form->isValid()) {
        $this->getDoctrine()->getManager()->flush();

        $this->addFlash(
            'success',
            "L'opérateur a bien été ajouté au poste {$poste->getNom()}  !"
        );
        return $this->redirectToRoute('operateur_index');
    }

    return $this->render('poste/addope.html.twig', [
        'poste' => $poste,
        'form' => $form->createView(),
    ]);
}
class PosteType2 extends AbstractType
{

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('operateurs', EntityType::class, [
                'class' => Operateur::class, 
                'label' => 'ajouter un opérateur à ce poste',
                'choice_label' => 'nom',
                'multiple' => true,
                'expanded' => true,
            ])
            ->add('save', SubmitType::class, [
                'label' => 'Enregistrer',
                'attr' => [
                    'class' => 'btn btn-primary'
                ]
            ]);
        ;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => Poste::class,
        ]);
    }
}
PostType2中的表单:

     /**
     * @ORM\ManyToMany(targetEntity=Operateur::class, inversedBy="postes")
     * @ORM\JoinTable(name="poste_operateur")
     */
    private $operateurs;

     /**
     * @return Collection|Operateur[]
     */
    public function getOperateurs(): Collection
    {
        return $this->operateurs;
    }

    public function addOperateur(Operateur $operateur): self
    {
        if (!$this->operateurs->contains($operateur)) {
            $this->operateurs[] = $operateur;
            $operateur->addPoste($this);
        }

        return $this;
    }

    public function removeOperateur(Operateur $operateur): self
    {
        $this->operateurs->removeElement($operateur);
        $operateur->removePoste($this);

        return $this;
    }
/**
 * @ORM\ManyToMany(targetEntity=Poste::class, mappedBy="operateurs")
 */
private $postes;


/**
* @return Collection|Poste[]
*/
public function getPostes(): Collection
{
    return $this->postes;
}

public function addPoste(Poste $poste): self
{
    if (!$this->postes->contains($poste)) {
        $this->postes[] = $poste;
        $poste->addOperateur($this);
    }

    return $this;
}

public function removePoste(Poste $poste): self
{
    if ($this->postes->removeElement($poste)) {
        $poste->removeOperateur($this);
    }

    return $this;
}
/**
 * @Route("/{id}/new", name="poste_ope", methods={"GET", "POST"})
 */
public function addOpe(Request $request, Poste $poste): Response
{
    $form = $this->createForm(PosteType2::class, $poste);
    $form->handleRequest($request);

    if ($form->isSubmitted() && $form->isValid()) {
        $this->getDoctrine()->getManager()->flush();

        $this->addFlash(
            'success',
            "L'opérateur a bien été ajouté au poste {$poste->getNom()}  !"
        );
        return $this->redirectToRoute('operateur_index');
    }

    return $this->render('poste/addope.html.twig', [
        'poste' => $poste,
        'form' => $form->createView(),
    ]);
}
class PosteType2 extends AbstractType
{

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('operateurs', EntityType::class, [
                'class' => Operateur::class, 
                'label' => 'ajouter un opérateur à ce poste',
                'choice_label' => 'nom',
                'multiple' => true,
                'expanded' => true,
            ])
            ->add('save', SubmitType::class, [
                'label' => 'Enregistrer',
                'attr' => [
                    'class' => 'btn btn-primary'
                ]
            ]);
        ;
    }

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

问题出在PosteController中,下面是更正:


以下是帮助我的文档:

你能尝试替换
$this->postes[]=$poste通过
$this->postes->add($poste)?每个类中是否都有构造函数,在Post中有$this->operators=new ArrayCollection(),在operators中有$this->postes=new ArrayCollection()?