簡體   English   中英

刪除多對多關系

[英]Deleting many-to-many relations

請幫幫我。

我無法刪除與中間表的多對多關系。

我有User,Mailing和UserMailing實體。 用戶有許多Mailing-s,郵件有許多User-s。 並且UserMailing包含User和Mailing之間的關聯

我有表格,可以查看所有郵件

用戶實體

<?php
/**
 * @ORM\Entity
 * @ORM\Table(name="users")
 */
class User extends BaseUser
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORM\OneToMany(targetEntity="UserMailing", mappedBy="user", cascade={"all"})
     * */
    protected $user_mailing;

    protected $mailings;
}

public function __construct()
{
    parent::__construct();
    $this->user_mailing = new ArrayCollection();
    $this->mailings = new ArrayCollection();
}

public function getMailing()
{
    $mailings = new ArrayCollection();

    foreach ($this->user_mailing as $um) {
        $mailings[] = $um->getMailing();
    }

    return $mailings;
}

public function setMailing($mailings)
{
    foreach($mailings as $m)
    {
        $user_mailing = new UserMailing();

        $user_mailing->setUser($this);
        $user_mailing->setMailing($m);

        $this->addUserMailing($user_mailing);
    }

}

public function addUserMailing($userMailing)
{
    $this->user_mailing[] = $userMailing;
}

public function removeUserMailing($userMailing)
{
    $this->user_mailing->removeElement($userMailing);
}
} 

郵寄實體

namespace Pet\UserBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use Pet\UserBundle\Entity\User;

/**
 * @ORM\Entity
 * @ORM\Table(name="mailings")
 */
class Mailing
{

/**
 * @ORM\Column(name="id", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="IDENTITY")
 */
protected $id;

/**
 * @ORM\Column(type="string", length=100)
 */
protected $name;

/**
 * @ORM\OneToMany(targetEntity="UserMailing" , mappedBy="mailing" , cascade={"all"})
 * */
protected $user_mailing;

public function getName()
{
    return $this->name;
}

public function setName($name)
{
    $this->name = $name;
    return $this->name;
}

}

UserMailing實體

namespace Pet\UserBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use Pet\UserBundle\Entity\User;
use Pet\UserBundle\Entity\Mailing;


/**
 * @ORM\Entity
 * @ORM\Table(name="user_mailings")
 * @ORM\HasLifecycleCallbacks()
 */
class UserMailing
{
/**
 * @ORM\Column(name="id", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="IDENTITY")
 */
protected $id;

/**
 * @ORM\ManyToOne(targetEntity="Mailing", inversedBy="user_mailing")
 * @ORM\JoinColumn(name="mailing_id", referencedColumnName="id")
 * */
protected $mailing;

/**
 * @ORM\ManyToOne(targetEntity="User", inversedBy="user_mailing")
 * @ORM\JoinColumn(name="user_id", referencedColumnName="id")
 * */
protected $user;


public function setUser(User $user = null)
{
    $this->user = $user;

    return $this;
}

public function setMailing(Mailing $mailing = null)
{
    $this->mailing = $mailing;

    return $this;
}

public function getUser()
{
    return $this->user;
}

public function getMailing()
{
    return $this->mailing;
}
}

形成

<?php

namespace Pet\UserBundle\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;

class MailingFormType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder->add('mailing', 'entity', array(
        'class' => 'PetUserBundle:Mailing',
        'property' => 'name',
        'multiple' => true,
        'expanded' => true,
        'label' => 'form.mailing', 'translation_domain' => 'PetUserBundle',
    ));




}

public function getName()
{
    return 'formMailing';
}

public function getDefaultOptions(array $options)
{
    return array(
        'data_class' => 'Pet\UserBundle\Entity\User'
    );
}
}

控制器動作

<?php
public function showMailingAction()
{
    $user = $this->container->get('security.context')->getToken()->getUser();
    if (!is_object($user) || !$user instanceof UserInterface) {
        throw new AccessDeniedException('This user does not have access to this section.');
    }

    $form = $this->container->get('form.factory')->create(new MailingFormType(), $user); 

    $previousCollections = $user->getMailing();
    $previousCollections = $previousCollections->toArray();

    $request = $this->container->get('request');
    if ($request->getMethod() == 'POST')
    {

        $form->bind($request);

        if ($form->isValid())
        {   
            foreach($previousCollections as $um)
            {   
                $user->removeUserMailing($um);
            }    

            $em->persist($user);
            $em->flush();
            $this->setFlash('pet_user_success', 'profile.flash.updated');
            return new RedirectResponse($this->getRedirectionUrl($user));
        } 
    }

        return $this->container->get('templating')->renderResponse('PetUserBundle:Profile:subscriptions.html.'.$this->container-    >getParameter('fos_user.template.engine'), 
           array(
                 'form' => $form->createView(),
                 )
           );

}

添加用戶郵件-好的,但是方法$entity->removeUserMailing($um)不起作用(((

請幫我...

您已經弄亂了ArrayCollections。 不要自己寫那些getter和setter。

刪除它們,然后運行doctrine:generate:entities PetUserBundle:Userdoctrine:generate:entities PetUserBundle:Mailing

然后,您可以簡單地調用$user->getMailings->clear()而不是遍歷數組並單獨刪除每個數組。

暫無
暫無

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

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