【发布时间】:2012-08-29 21:54:02
【问题描述】:
我不知道为什么,也许我错过了一些基本逻辑,但我总是再次遇到同样的问题。我不能持久化 ManyToMany 集合,它也面临着 OneToMany 集合,尽管我可以解决这个问题。
我通读了学说文档,我认为我确实理解了 mappedBy 和 inversedBy 的内容(最后一个始终是所有者,因此负责保存数据,如果我错了,请纠正我)。
所以这是我现在拥有的一个基本示例,我无法弄清楚。
我有一个名为 Site 的实体:
#Site.php
...
/**
* @ORM\ManyToMany(targetEntity="Category", mappedBy="sites")
*/
protected $categories;
还有一个叫Category:
#Category.php
...
/**
* @ORM\ManyToMany(targetEntity="Site", inversedBy="categories")
* @ORM\JoinTable(name="sites_categories")
*/
protected $sites;
使用 Symfony2 实体生成器,它为我的实体添加了一些 getter 和 setter,看起来像这样。
网站:
#Site.php
...
/**
* Add categories
*
* @param My\MyBundle\Entity\Category $categories
*/
public function addCategory(\My\MyBundle\Entity\Category $categories)
{
$this->categories[] = $categories;
}
/**
* Get categories
*
* @return Doctrine\Common\Collections\Collection
*/
public function getCategories()
{
return $this->categories;
}
同样重要的
类别:
#Category.php
...
/**
* Add sites
*
* @param My\MyBundle\Entity\Site $sites
*/
public function addSite(\My\MyBundle\Entity\Site $sites)
{
$this->sites[] = $sites;
}
/**
* Get sites
*
* @return Doctrine\Common\Collections\Collection
*/
public function getSites()
{
return $this->sites;
}
很公平。
现在在我的控制器中,我正在尝试持久化一个 Site 对象:
public function newsiteAction() {
$site = new Site();
$form = $this->createFormBuilder($site); // generated with the FormBuilder, so the form includes Category Entity
// ... some more logic, like if(POST), bindRequest() etc.
if ($form->isValid()) {
$em = $this->getDoctrine()
->getEntityManager();
$em->persist($site);
$em->flush();
}
}
结果总是一样的。 它保留了站点对象,但不是类别实体。而且我也知道原因(我认为):因为类别实体是拥有方。
但是,我是否总是必须做这样的事情才能坚持下去? (这实际上是我对一些 OneToMany 集合的解决方法)
$categories = $form->get('categories')->getData();
foreach($categories as $category) {
// persist etc.
}
但是我在这里遇到了很多问题,比如我必须执行与上面相同的循环来删除、编辑等。
有什么提示吗?我真的会给能够让我清醒的人一个网络拥抱。谢谢!
。 . .
更新
我最终改变了 ManyToMany 映射之间的关系(拥有和反向)。
如果其他人遇到这个问题,你需要清楚双向关系的概念,我也花了一段时间才理解(我希望我现在明白了,请参阅link)。 基本上我的问题是:您要保留的对象必须始终是拥有站点(拥有站点始终是在注释中“反转”的实体)。
还有级联注解的概念(见此link,感谢moonwave99)
非常感谢,我希望这对将来的参考有所帮助! :)
【问题讨论】:
-
函数为什么叫addVideotagCategory而不是addCategory?
-
你说得对,卡洛斯,我的错,我编辑了!