Doctrine - 如何保持ManyToOne同步?

时间:2012-12-31 00:42:08

标签: symfony orm doctrine mapping associations

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

我希望Libraries有许多Collections,我认为这是一个'ManytoOne'关系,因为Collection会保留外键。

一些片段:

在图书馆:

/**
*
* @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();

上面的代码不会在library_id表格中设置Collection列,我认为这是因为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 个答案:

答案 0 :(得分:0)