2015-04-15 32 views
2

我有一個具有多個照片實體:Symfony的形式收集不節能的參考

/** 
* related images 
* @ORM\OneToMany(targetEntity="Photo", mappedBy="entity",cascade={"persist"}) 
* @ORM\OrderBy({"uploaded_at" = "ASC"}) 
*/ 
private $photos; 

照片與實體多對一關係

/** 
* @ORM\ManyToOne(targetEntity="Acme\AppBundle\Entity\Entity", inversedBy="photos") 
* @ORM\JoinColumn(name="entity_id", referencedColumnName="id", onDelete="CASCADE") 
*/ 
private $entity; 

所有setter方法和getter設置我foliving symfony的採集文件:http://symfony.com/doc/current/reference/forms/types/collection.html

FormType:

   ->add('photos', 'collection', array(
      'type' => new PhotoFormType(), 
      'allow_add' => true, 
      'by_reference' => false, 
      'allow_delete' => true, 
      'prototype' => true 

     )) 

照排機:

 $builder 
     ->add('title', null, ['label' => 'front.photo.title', 'required' => true]) 
     ->add('image', 'file', array('required' => false)) 
    ; 

上傳我使用vichUploadableBundle,圖片都保存得很好,但ENTITY_ID不保存和具有空。我不知道我在這裏錯過了什麼。

回答

1

我也去過了。我認爲主要的問題是,即使主要實體有cascade = {「persist」},當你創建一個新條目時,孩子不會獲得ID。 所以我做了什麼,這是一種黑客,但工作正常的是this

// $em->persist($entity); After persisting entity: 
foreach ($entity->getPhotos() as $photo) { 
    $photo->setEntity($entity); 
} 

基本上在他們的父親創建後堅持ID在孩子們。

但是在另一點上,至少我是如何理解主義的,請糾正我,如果我錯了。嘗試添加orphanRemoval /獲取附加屬性:

父親實體

/** 
* related images 
* @ORM\OneToMany(targetEntity="Photo", mappedBy="entity",cascade={"persist"}, orphanRemoval=true, fetch="EAGER") 
* @ORM\OrderBy({"uploaded_at" = "ASC"}) 

*/ 私人$照片;

+0

我猜你也許可以在add方法中做到這一點而不是遍歷所有這些。這看起來像是一些教義應該處理的東西。 – Hayden

0

照片實體被持久化,所以我添加到控制器處理程序來爲每個照片實體設置。不知道它是否是正確的解決方案,但它的工作。

   /** @var Photo $photo */ 
       foreach ($entity->getPhotos() as $photo){ 
        $photo->setEntity($entity); 
        $em->persist($photo); 
       } 
+0

看起來不錯,但我不會堅持每一個循環,只是一個:$ em-> flush()之後的foreach :) –

1

遇到同樣的問題,還記得還有更好的解決辦法。

您需要指定在具有集合的實體中添加和刪除函數。

class Entity 
{ 
    // ... 

    public function addPhoto(Photo $photo) 
    { 
     $this->photos->add($photo); 
     $photo->setEntity($this); 
    } 

    public function removePhoto(Photo $photo) 
    { 
     $this->photos->removeElement($photo); 
    } 
} 

所以在這種情況下,你不需要在控制器中的循環。 此外,如果

orphanRemoval =真

設置,以刪除沒有任何問題。

3

以下是迄今爲止關於此問題的最佳解決方案,用symfony表單組件進行調查或研究。

FormType:

 ->add("photos",'collection', array(
      'type' => new PhotoFormType(), 
      'allow_add' => true, 
      'allow_delete' => true, 
      'by_reference' => false 
)) 

實體類

public function addPhoto(Photo $photo) 
{ 
    $photo->setEntity($this); 
    $this->photos->add($photo);   
} 

public function removePhoto(Photo $photo) 
{ 
    $this->photos->removeElement($photo); 
} 

最佳做法是不使用循環來手動綁定參考實體。記住by_reference必須是假的。像'by_reference'=> false。

+0

謝謝,'by_reference => false'這一行爲我做了訣竅! – DelphiLynx