Я работаю над проектом с Symfony 3 и доктриной.У меня много-много отношений между Pack и Produit:
Pack Entity:
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);
}
}
Produit Entity:
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;
}
}
Я хочу назначить продукты для пакета, поэтому у меня есть форма, которая содержит продукты в поле выбора.(пакет и продукты создаются ранее).
Тип формы:
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();
// ...
}
//...
}
Проблема заключается в том, что я выбираю продукты иотправить, он назначает выбранные продукты пакету, но продукты, назначенные ранее, удаляются.Я хочу, чтобы они все еще назначались, так как решить эту проблему?