学说获取连接



首先,我将给出一个带有伪代码的示例,然后我将解释问题所在。假设我有两个实体用户和电话号码。它们的关系是一对多。在我的用户存储库中,我可以有这样的东西:

class UserRepository
{
    public function getUser($id, $type)
    {
        $users = $this->createQuery("SELECT u, p FROM User u JOIN u.phonenumbers p
            WHERE u.id = :id AND p.type = :type")
            ->setParameters(array(
                'id' => $id,
                'type' => $type,
            ))
            ->getResult();
        return $users[0];
    }
}

在我的应用程序中,如果我有类似的东西:

$user = $userRepo->getUser(1, 'home');
var_dump($user->getPhonenumbers()); // here phonenumbers collection is ok
$user = $userRepo->getUser(1, 'work');
var_dump($user->getPhonenumbers()); // Here phonenumbers collection is wrong.
                                // It's exactly the same as the previous one.

所以我的问题是:是否可以使用获取连接(具有不同的条件)并每次都获得正确的集合?

获取 联接和过滤集合并不是可以很好地协同工作的事情。以下是您应该如何操作:

SELECT 
    u, p 
FROM 
    User u 
JOIN 
    u.phonenumbers p
JOIN
    u.phonenumbers p2
WHERE 
    u.id = :id 
    AND 
    p2.type = :type

这会对第二个连接(而非水合)p2应用过滤,从而产生正确的水合和过滤。

使用查询生成器,它要简单得多。

public function getUser($id, $type)
{
    return $this->createQueryBuilder("u")
        ->leftJoin("u.Phonenumbers", "p", "WITH", "p.type=:type")
        ->where("u.id=:id")
        ->setParameters(.....)
        ->getQuery()
        ->getOneOrNullResult() ;
}

相关内容

  • 没有找到相关文章

最新更新