Symfony 2.0实体表单字段不保存

时间:2011-10-06 06:19:49

标签: php symfony doctrine doctrine-orm

我在使用multiple = true保存实体表单字段中所做的选择时遇到问题。

当调用$ 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();
  }
}

我在$ form-> isValid()之后检查了$ news_item对象,并且count($ 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();
  }
}

2 个答案:

答案 0 :(得分:4)

我认为您在代码中遗漏了$product->addNewsItem($news_item)$news_item->addProduct($product),因为在双向关联(似乎是您的情况)中,您必须更新双方的字段。

要避免这种情况,您可以在关联的两侧设置级联选项:

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

这样你的代码就可以了。您可以选择适当的级联选项,查看here

答案 1 :(得分:0)

我没有遇到同样的问题,但我需要能够使用类似的实体加载FixtureData。我被引用到这个文档:http://www.doctrine-project.org/docs/orm/2.1/en/reference/working-with-associations.html我相信它会解决我的问题。我希望这也适合你。

JS