[英]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.