首先,我将给出一些伪代码示例,然后我将解释问题是什么。让我说我有两个实体User和Phonenumber。他们的关系是一对多的。在我的UserRepository中我可以有类似的东西:
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.
所以我的问题是:是否可以使用fetch join(具有不同的标准)并且每次都能获得正确的集合?
答案 0 :(得分:5)
获取加入和过滤集合并不能很好地协同工作。这是你应该怎么做的:
SELECT
u, p
FROM
User u
JOIN
u.phonenumbers p
JOIN
u.phonenumbers p2
WHERE
u.id = :id
AND
p2.type = :type
这适用于第二次连接(而不是水合)p2
的过滤,这会导致正确的水合和过滤。
答案 1 :(得分:-2)
使用querybuilder,它更简单。
public function getUser($id, $type)
{
return $this->createQueryBuilder("u")
->leftJoin("u.Phonenumbers", "p", "WITH", "p.type=:type")
->where("u.id=:id")
->setParameters(.....)
->getQuery()
->getOneOrNullResult() ;
}