Помоги мне, пожалуйста.
Я не могу удалить отношения «многие ко многим» с промежуточной таблицей.
У меня есть объекты 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)
не работает (((
Пожалуйста, помогите мне…
Вы испортили ваши ArrayCollections. Не пишите эти геттеры и сеттеры самостоятельно.
Удалить их и запустить doctrine:generate:entities PetUserBundle:User
а также doctrine:generate:entities PetUserBundle:Mailing
,
Затем вы можете просто позвонить $user->getMailings->clear()
вместо того, чтобы перебирать массив и удалять каждый в отдельности.
Других решений пока нет …