教义 - 如何保持多对一同步?

Posted

技术标签:

【中文标题】教义 - 如何保持多对一同步?【英文标题】:Doctrine - how to keep ManyToOne synchronized? 【发布时间】:2012-12-31 00:42:08 【问题描述】:

在阅读了 Doctrine 参考资料和有关它的 Symfony 教程后,我开始将它集成到一个项目中。我遇到了一个我认为教义可以解决的问题:

我想拥有Libraries 和许多Collections,我认为这是一个“多对一”关系,因为集合将保留外键。

一些sn-ps:

在图书馆:

/**
*
* @var ArrayCollection
*
* @ORM\OneToMany(targetEntity="Collection", mappedBy="library")
*/
private $collections;

收藏中:

 /**
 * @var Library
 *
 * @ORM\ManyToOne(targetEntity="Library", inversedBy="collections")
 * @ORM\JoinColumn(name="library_id", referencedColumnName="id")
 */
private $library;

由于大多数注释是默认的,可以省略,这是一个非常基本的设置。

一个示例控制器代码:

    $library = new Library();
    $library->setName("Holiday");
    $library->setDescription("Our holiday photos");

    $collection = new Collection();
    $collection->setName("Spain 2011");
    $collection->setDescription("Peniscola");

    $library->addCollection($collection);

    $em=$this->getDoctrine()->getManager();
    $em->persist($collection);
    $em->persist($library);        
    $em->flush();

上面的代码不会在Collection 表中设置library_id 列,我认为这是因为Library 不是所有者。

    $library = new Library();
    $library->setName("Holiday");
    $library->setDescription("Our holiday photos");

    $collection = new Collection();
    $collection->setName("Spain 2011");
    $collection->setDescription("Peniscola");

    $collection->setLibrary($library); <--- DIFFERENCE HERE

    $em = $this->getDoctrine()->getManager();
    $em->persist($collection);
    $em->persist($library);
    $em->flush();

有效。但我希望能够使用库的添加和删除方法。

更改这些添加和删除方法来调用setLibrary 方法是否常见?

public function addCollection(\MediaBox\AppBundle\Entity\Collection $collections)

    $this->collections[] = $collections;
    $collections->setLibrary($this);
    return $this;

public function removeCollection(\MediaBox\AppBundle\Entity\Collection $collections)

    $this->collections->removeElement($collections);
    $collections->setLibrary(null);

我不认为这很好。

这是学说中的最佳实践还是一般的 ORM?

提前致以诚挚的问候和感谢!

【问题讨论】:

【参考方案1】:

显然这是要走的路。

如果有人需要它:

http://docs.doctrine-project.org/projects/doctrine-orm/en/2.0.x/reference/working-with-associations.html#association-management-methods

解释这个问题。

【讨论】:

以上是关于教义 - 如何保持多对一同步?的主要内容,如果未能解决你的问题,请参考以下文章

访问为空的左连接成员时的教义痛苦

django之间的区别 - 一对一,多对一,多对多

如何将这种多对一的关系改为一对一?

mytabits表关联一对一(多对一?)

一对一、一对多、多对多,如何设计数据表?

如何在 JpaRepository 中为多对一映射实体编写查询