【问题标题】:Symfony2: Error persisting ManyToMany/OneToMany RelationshipsSymfony2:错误持久多对多/一对多关系
【发布时间】: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?
  • 你说得对,卡洛斯,我的错,我编辑了!

标签: symfony doctrine


【解决方案1】:

关于OneToMany关系,你想了解cascade注解——来自Doctrine docs [8.6]:

存在以下级联选项:

  • persist :级联将操作持久化到关联实体。
  • remove :级联删除操作到关联实体。
  • merge :级联合并操作到关联实体。
  • detach :将分离操作级联到关联实体。
  • all :级联对关联实体进行持久化、删除、合并和分离操作。

以下文档示例:

<?php
class User
{
    //...
    /**
     * Bidirectional - One-To-Many (INVERSE SIDE)
     *
     * @OneToMany(targetEntity="Comment", mappedBy="author", cascade={"persist", "remove"})
     */
    private $commentsAuthored;
    //...
}

当您将 cmets 添加到作者时,它们会在您保存时持久化 - 当您删除作者时,cmets 也会告别。

我最近在设置 REST 服务时遇到了同样的问题,级联注释让我摆脱了您之前提到的所有解决方法 [我在一开始就使用了] - 希望这会有所帮助。

【讨论】:

  • 嘿,moonwave99,谢谢。实际上这确实很有趣,我只是尝试过。我最终扭转了关系(拥有站点现在是站点,因此可以保留类别对象)。它就像一个魅力,但仍然很高兴知道有像你提到的一些想法以供将来参考。删除级联实际上是我真正需要的东西,非常感谢!
猜你喜欢
  • 1970-01-01
  • 2016-11-13
  • 2017-01-10
  • 1970-01-01
  • 1970-01-01
  • 2011-11-28
  • 1970-01-01
  • 2023-03-20
  • 1970-01-01
相关资源
最近更新 更多