关于php:Symfony 2学说,加入3个表

Symfony 2 + Doctrine, joining 3 tables

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

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

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

现在我有第四个实体GameCovers,其字段为:game_id,platform_id和image_id。
一切似乎都有效-教义产生的吸气剂和吸气剂。我的问题是如何从数据库获取数据?

现在在Game Enity中,我有方法:

1
2
3
4
5
6
7
8
9
/**
* Get game_covers
*
* @return Doctrine\\Common\\Collections\\Collection
*/

public function getGameCovers()
{
   return $this->game_covers;
}

但是我如何只为一个平台获取盒盖呢?例如:PC?


您应该看一下自定义实体存储库:
http://symfony.com/doc/2.0/book/doctrine.html#custom-repository-classes

然后在每种方法中createQuery,例如:

1
2
3
4
5
6
# 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而是要创建自己的查询....


这很容易,$em->getRepository('GameCover')->findOneBy(array('platform' => $platform, 'game' => $game))其中平台和游戏是各自的对象或ID。

您可以使用GameCover的自定义存储库,通过另一种方法为您执行此操作。

如果使用getGameCovers,则会触发包含所有游戏封面的代理的初始化,并且学说将从数据库中获取所有这些游戏封面。因此,如果您不想执行此操作,只需从GameCover存储库中获取所需的特定对象即可。