0

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

我想拥有Librariesmany 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?

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

4

1 回答 1

0

显然,这是要走的路。

对于有人需要它的情况:

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

解释了这个问题。

于 2012-12-31T00:59:29.300 回答