教义 - 如何保持多对一同步?
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
解释这个问题。
【讨论】:
以上是关于教义 - 如何保持多对一同步?的主要内容,如果未能解决你的问题,请参考以下文章