Symfony2:查询具有2个其他对象作为参数的对象

时间:2014-07-29 10:11:59

标签: database symfony doctrine-orm

执行以下操作的最佳方式是:我有一个gameobject实体,其中包含属性gameuser。现在我的方法获取游戏ID和用户ID,我想查找gameobject game =游戏ID对象和user =用户ID对象。

我尝试了以下内容:

    $game = $this->getDoctrine()->getRepository("xxx:Game")->find($game_id);
    $user = $this->getDoctrine()->getRepository("xxx:User")->find($user_id);
    $gameobject_query = $em->getRepository('xxx:Gameobject')->createQueryBuilder('g')
        ->where('g.game = :game AND g.user = :user')
        ->setParameters(array(
            'game' => $game,
            'user' => $user
        ))
        ->getQuery();
    $gameobject = $gameobject_query->getResult();

您的建议会受到关注:)

2 个答案:

答案 0 :(得分:1)

我认为以下内容应该有效:

$repository = this->getDoctrine()->getRepository('xxx:GameObject');
$queryBuilder = $repository->createQueryBuilder('go')
    ->innerJoin('go.game', 'g')
    ->innerJoin('go.user', 'u')
    ->where('g.id = :gameId')
    ->andWhere('u.id = :userId')
    ->setParameter('gameId', $gameId)
    ->setParameter('userId', $userId);

$gameObjects = $queryBuilder->getQuery()
    ->execute();

或者,以下内容也可以起作用并且效率更高:它应该做同样的事情但不需要加入其他实体:

$repository = this->getDoctrine()->getRepository('xxx:GameObject');
$queryBuilder = $repository->createQueryBuilder('go')
    ->where('IDENTIY(go.game) = :gameId')
    ->andWhere('IDENTITY(go.user) = :userId')
    ->setParameter('gameId', $gameId)
    ->setParameter('userId', $userId);

$gameObjects = $queryBuilder->getQuery()
    ->execute();

答案 1 :(得分:0)

为什么不使用Gameobject repo的findOneBy方法?

$game = $this->getDoctrine()->getRepository("xxx:Game")->find($game_id);
$user = $this->getDoctrine()->getRepository("xxx:User")->find($user_id);
$gameobject = $em->getRepository('xxx:Gameobject')->findOneBy(array(
        'game' => $game,
        'user' => $user
    ));