我在使用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();
}
}
答案 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