Symfony 2 + Doctrine,加入3个表

时间:2012-10-30 11:33:23

标签: php symfony doctrine-orm many-to-many

我有3个实体:游戏,平台(如PC,XBOX,PS3等)和图像。

游戏可以在很多平台上发布,平台可以与很多游戏相关,最后游戏可以有很多盒子(例如每个平台一个)。

我想通过连接表来关联这3个实体。 我做了一些阅读,发现我应该创建另一个实体来描述关系,我做了。

现在我有第四个实体GameCovers,其中包含以下字段:game_id,platform_id和image_id。 一切似乎都有效 - 学说生成了吸气剂和二传手。我的问题是如何从数据库中获取数据?

在Game Enity中我现在有方法:

/**
* Get game_covers
*
* @return Doctrine\Common\Collections\Collection 
*/
public function getGameCovers()
{
   return $this->game_covers;
}

但是我如何仅为一个平台获取盒子封面,例如:PC?

2 个答案:

答案 0 :(得分:1)

您应该查看自定义实体存储库: http://symfony.com/doc/2.0/book/doctrine.html#custom-repository-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();
}

这显然是简化的例子,但关键点不是依赖于getter而是创建自己的查询....

答案 1 :(得分:0)

这很容易,$em->getRepository('GameCover')->findOneBy(array('platform' => $platform, 'game' => $game))平台和游戏是相应的对象或ids。

您可以使用GameCover的自定义存储库以不同的方法为您执行此操作。

如果您使用getGameCovers,您将触发持有所有游戏封面的代理的初始化,并且学说将从数据库中获取所有这些内容。因此,如果您不想这样做,只需从GameCover存储库中获取您想要的特定内容即可。