Php Symfony 2+;条令,加入3个表格

Php Symfony 2+;条令,加入3个表格,php,symfony,doctrine-orm,many-to-many,Php,Symfony,Doctrine Orm,Many To Many,我有3个实体:游戏、平台(如PC、XBOX、PS3等)和图像 游戏可以在多个平台上发布,平台可以与多个游戏相关,最后游戏可以有多个封套(例如每个平台一个封套) 我想通过联接表来关联这3个实体。 我读了一些书,发现我应该创建另一个实体来描述关系,我做到了 现在我有了第四个实体的游戏封面和字段:游戏id、平台id和图像id。 一切似乎都起作用了——由条令产生的干劲和干劲。我的问题是如何从数据库中获取数据 在游戏Enity now中,我有一个方法: /** * Get game_covers * *

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

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

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

现在我有了第四个实体的游戏封面和字段:游戏id、平台id和图像id。 一切似乎都起作用了——由条令产生的干劲和干劲。我的问题是如何从数据库中获取数据

在游戏Enity now中,我有一个方法:

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

但是如何仅获取一个平台的盒盖(例如:PC?

您应该查看自定义实体存储库:

在每个方法中,您将
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,而是创建自己的查询……

您应该看看自定义实体存储库:

在每个方法中,您将
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,而是创建自己的查询……

这很简单,
$em->getRepository('GameCover')->findOneBy(数组('platform'=>$platform,'game'=>$game))
其中platform和game是各自的对象或id

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


如果您使用GetGameColds,您将触发持有所有游戏封套的代理的初始化,并且doctrine将从数据库中获取所有封套。因此,如果您不想这样做,只需从GameCover存储库中获取您想要的特定存储库。

这很简单,
$em->getRepository('GameCover')->findOneBy(数组('platform'=>$platform',game'=>$game))
其中platform和game是各自的对象或id

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


如果您使用GetGameColds,您将触发持有所有游戏封套的代理的初始化,并且doctrine将从数据库中获取所有封套。因此,如果您不想这样做,只需从GameCover存储库中获取您想要的特定记录。

Thaks寻求答案,但问题是,无论发布了多少平台,我只有一个游戏记录。例如:“拒付”是游戏表中的一条记录,但它是为3个平台发布的,所以在游戏平台表中有3条记录。我不明白为什么这是一个问题。。。取你想要的游戏,检查它是否在你想要的平台上,然后取游戏的封面。也许我不明白什么。Symfony2和Dictrine对我来说还是一种新鲜事物。我一直在使用Symfony1和spreep。你的例子中的$game不是仍然是同一个对象吗?因为它只是游戏表中的一条记录?Thaks是一个答案,但问题是我只有一条记录,不管它发布了多少平台。例如:“拒付”是游戏表中的一条记录,但它是为3个平台发布的,所以在游戏平台表中有3条记录。我不明白为什么这是一个问题。。。取你想要的游戏,检查它是否在你想要的平台上,然后取游戏的封面。也许我不明白什么。Symfony2和Dictrine对我来说还是一种新鲜事物。我一直在使用Symfony1和spreep。您的示例中的$game不是仍然是同一个对象吗,因为它只是游戏表中的一条记录?可能是因为代码格式不好,不完整。嗯,我猜您并没有真正回答这个问题。可能是因为代码格式不好,不完整。嗯,我猜你没有真正回答这个问题。