我不知道为什么,也许我错过了一些基本的逻辑,但我总是再次遇到同样的问题。我不能坚持使用ManyToMany系列,并且它也面临着OneToMany系列,尽管我可以解决这个问题。
我通读了doctrine文档,我想我确实理解了mappedBy和inversedBy(最后一个始终是所有者,因此负责持久保存数据,如果我错了请纠正我)。
所以这是我现在的一个基本例子,我无法弄明白。
我有一个名为网站的实体:
#Site.php
...
/**
* @ORM\ManyToMany(targetEntity="Category", mappedBy="sites")
*/
protected $categories;
另一个名为类别:
#Category.php
...
/**
* @ORM\ManyToMany(targetEntity="Site", inversedBy="categories")
* @ORM\JoinTable(name="sites_categories")
*/
protected $sites;
使用Symfony2实体发生器,它为我的Entites添加了一些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)。 基本上我的问题是:你要坚持的对象必须始终是拥有的网站(拥有网站始终具有"反转的实体#&# 34;在注释中。
还有级联注释的概念(请参阅此link,感谢moonwave99)
非常感谢,我希望能帮助某人以供将来参考! :)
答案 0 :(得分:2)
关于OneToMany
关系,您希望了解级联注释 - 来自Doctrine docs [8.6]:
存在以下级联选项:
- persist:Cascades将操作持久保存到关联实体。
- 删除:级联删除对关联实体的操作。
- merge:Cascades将操作合并到关联实体。
- detach:Cascades将操作分离给相关实体。
- all:级联持久,删除,合并和分离操作到关联实体。
以下文档示例:
<?php
class User
{
//...
/**
* Bidirectional - One-To-Many (INVERSE SIDE)
*
* @OneToMany(targetEntity="Comment", mappedBy="author", cascade={"persist", "remove"})
*/
private $commentsAuthored;
//...
}
当您向作者添加评论时,它们会在您保存时保留 - 当您删除作者时,评论也会告别。
我最近在设置REST服务时遇到了同样的问题,并且级联注释让我摆脱了你之前提到的所有解决方法[我在一开始就使用] - 希望这很有帮助。