在阅读了 Doctrine 参考和 Symfony 教程之后,我开始将它集成到一个项目中。我遇到了一个我认为学说可以解决的问题:
我想拥有Libraries
many 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?
提前致以诚挚的问候和感谢!