我有3个实体:游戏,平台(例如PC,Xbox,PS3等)和图像。
游戏可以在许多平台上发布,平台可以与许多游戏有关,最后游戏可以具有许多盒子盖(例如,每个平台一个)。
我想通过加入表将这三个实体联系起来。我做了一些阅读,发现我应该创建另一个实体来描述关系,然后我做了。
现在,我拥有带有字段的第四个实体游戏:game_id,platform_id and image_id。一切似乎都起作用 - 学说产生的getters和setter。我的问题是如何从DB获取数据?
在游戏源中,我有方法:
/**
* Get game_covers
*
* @return DoctrineCommonCollectionsCollection
*/
public function getGameCovers()
{
return $this->game_covers;
}
但是如何仅获取一个平台的盒盖:PC?
您应该查看自定义实体存储库:http://symfony.com/doc/2.0/book/doctrine.html#custom-repository-close-classes
在每种方法中,您将createQuery
,例如:
# Fetch all the games that have PC release
public function getPcGames(){
$q = $entityManager->createQuery("SELECT gc,p,g FROM GameCover gc JOIN gc.platform p JOIN gc.game g WHERE p.name = :platformName");
$q->setParameter('platformName', 'PC');
return $q->getResult();
}
显然,这超出了简化的示例,但是关键点不是依靠getters,而是创建您自己的查询....
很容易, $em->getRepository('GameCover')->findOneBy(array('platform' => $platform, 'game' => $game))
平台和游戏是相应的对象或IDS。
您可以将自定义存储库用于GameCover,以不同的方法为您执行此操作。
如果您使用getgamecovers,则触发持有所有游戏封面的代理的初始化,而学说将从数据库中获取所有内容。因此,如果您不想这样做,只需从GameCover存储库中获取您想要的特定元素。