簡體   English   中英

更新多對多關系

[英]Update Many to Many relationship

我正在研究帶有symfony 3和主義的項目。 我在Pack和Produit之間有很多聯系:

包裝實體:

class Pack
{ 
    /**
     * @var ArrayCollection | Produit[]
     * @ORM\ManyToMany(targetEntity="AppBundle\Entity\Produit", inversedBy="packs")
     * @ORM\JoinTable(name="link_pack")
     */
    private $produits;

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

    }


    /**
     * @return Produit[]|ArrayCollection
     */
    public function getProduits()
    {
        return $this->produits;
    }

    public function addProduit(Produit $produit)
    {
        if ($this->produits->contains($produit)) {
            return;
        }
        $this->produits[] =  $produit;
    }

    public function removeProduit(Produit $produit)
    {
        if (! $this->produits->contains($produit)) {
            return;
        }
       return $this->produits->removeElement($produit);
    }
}

產品實體:

class Produit
{
    /**
     * @var ArrayCollection | Pack[]
     * @ORM\ManyToMany(targetEntity="AppBundle\Entity\Pack", mappedBy="produits")
     */
    private $packs;

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

    }

    /**
     * @return Pack[]|ArrayCollection
     */
    public function getPacks()
    {
        return $this->packs;
    }

    public function addPack(Pack $pack)
    {
        if ($this->packs->contains($pack)) {
            return;
        }
        $pack->addProduit($this);
        $this->packs[] =  $pack;
    }
}

我想將產品分配給pack,所以我有一個表單,其中包含一個select字段中的產品。 (包裝和產品是在之前創建的)。

表格類型:

class PackAffectProduitType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('produits', EntityType::class, array(
            'class' => Produit::class,        
            'choice_label' => 'libelle',
                    'multiple' => true,       
        ));
    }

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

控制器:

public function affectProduitsAction(Pack $pack, Request $request)
    {

        $form = $this->createForm(PackAffectProduitType::class, $pack);

        $form->handleRequest($request);
        dump($pack);
        if ($form->isSubmitted() && $form->isValid()) {
            $em = $this->getDoctrine()->getManager();
            dump($pack);
            $em->flush();
           // ...
        }
       //...
    }

問題是當我選擇產品並提交時,它將選定的產品分配給包裝,但之前分配的產品被刪除。 我希望他們仍然被分配,那么如何解決這個問題呢?

  • 如果您希望視圖添加或刪除值,那么如果您手動生成字段視圖結構,則不必忘記填充已經設置的值(例如,先前添加到Pack的產品)。

例如,通過將selected屬性添加到select 這樣做將用當前值預填充您的字段,因此在提交時僅刪除那些故意未被選擇的值。

  • 如果您不希望視圖顯示或對該包中已經設置的Produit實體一無所知,而只是盲目地執行添加操作,則可以在字段選項中添加mapped => false ,並手動在其中添加產品到包中您的控制器。

但是,這僅允許您添加,因為它不知道已經設置的值,並且您將不得不執行另一種情況/操作來執行刪除操作。 我認為上述方法更好。

在這最后一種情況下,您的控制器將如下所示:

public function affectProduitsAction(Pack $pack, Request $request)
{

    $form = $this->createForm(PackAffectProduitType::class, $pack);

    $form->handleRequest($request);
    if ($form->isSubmitted() && $form->isValid()) {
        $em = $this->getDoctrine()->getManager();
        if(is_array($form->get('produits')->getData()){
            foreach($form->get('produits')->getData() as $produit){
                $pack->addProduit($produit);
            }
        }
        $em->flush();
       // ...
    }
   //...
}

和你的FormType:

class PackAffectProduitType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('produits', EntityType::class, array(
            'class' => Produit::class,     
            'mapped' => false,   
            'choice_label' => 'libelle',
                    'multiple' => true,       
        ));
    }

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

嘗試在'by_reference' => false添加'by_reference' => false選項,它將強制使用實體中的setter和getter

暫無
暫無

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

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