Удаление отношений «многие ко многим»

Помоги мне, пожалуйста.

Я не могу удалить отношения «многие ко многим» с промежуточной таблицей.

У меня есть объекты User, Mailing и UserMailing.
У пользователя много почтовых рассылок, у почтовой рассылки много пользователей. И UserMailing содержат ассоциации между пользователем и почтовой рассылкой

У меня есть форма, которая просматривает все рассылки

Пользовательская сущность

<?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) не работает (((

Пожалуйста, помогите мне…

1

Решение

Вы испортили ваши ArrayCollections. Не пишите эти геттеры и сеттеры самостоятельно.

Удалить их и запустить doctrine:generate:entities PetUserBundle:User а также doctrine:generate:entities PetUserBundle:Mailing,

Затем вы можете просто позвонить $user->getMailings->clear() вместо того, чтобы перебирать массив и удалять каждый в отдельности.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]