2011-10-06 69 views
2

我遇到問題,保存在實體表單字段中進行的選擇multiple = true。Symfony 2.0實體表單字段不保存

當$ form-> bindRequest($ request)被調用時,選擇會經過,但在調用flush時不會保留在數據庫中。

下面是相關的控制器代碼:

$news_item = new News(); 

$form = $this->createFormBuilder($news_item) 
    ->add('products', 'entity', 
     array('class' => 'AcmeDemoBundle:Product', 
     'multiple' => TRUE)) 
    ->getForm(); 

$request = $this->getRequest(); 

if($request->getMethod() == "POST") { 
    $form->bindRequest($request); 
    if($form->isValid()) { 
    $this->em->persist($news_item); 
    $this->em->flush(); 
    } 
} 

我能在時隔$形式 - >的isValid(檢查$ news_item對象)和計數($ news_item->的getProducts())返回正確數量的項目。 $ news_item本身保存在數據庫中,但ManyToMany關係不被保存。

下面是引用(裁剪爲簡潔起見)的實體:

/** 
* @ORM\Entity 
* @ORM\Table(name="Product") 
*/ 
class Product { 
    /* 
    * @ORM\Id @ORM\Column(type="integer") 
    */ 
    protected $id; 

    /** 
    * @ORM\ManyToMany(targetEntity="News", inversedBy="products") 
    */ 
    protected $news_items = null; 

    public function __construct() { 
    $this->news_items = new ArrayCollection(); 
    } 

} 

/** 
* @ORM\Entity 
* @ORM\Table(name="News") 
*/ 
class News { 
    /** 
    * @ORM\Id @ORM\Column(type="integer") @ORM\GeneratedValue 
    */ 
    protected $id; 

    /** 
    * @ORM\ManyToMany(targetEntity="Product", mappedBy="news_items") 
    */ 
    protected $products = null; 

    public function __construct() { 
    $this->products = new ArrayCollection(); 
    } 
} 

回答

4

我認爲你缺少你的代碼$product->addNewsItem($news_item)$news_item->addProduct($product)這一點,因爲在雙向關聯(看來你的情況下),你必須更新雙方的領域。

爲了避免這種情況,你可以在關聯兩側設置級聯選項:

@ORM\ManyToMany(targetEntity="Product", mappedBy="news_items", 
    cascade={"persist", "remove"}) 

這樣,你的代碼將工作。您可以選擇相應的級聯選項,查看here