Php 学说获取连接

Php 学说获取连接,php,doctrine,doctrine-orm,Php,Doctrine,Doctrine Orm,首先,我将给出一个带有一些伪代码的示例,然后我将解释问题所在。假设我有两个实体User和Phonenumber。他们是一对多的关系。在我的UserRepository中,我可以有如下内容: class UserRepository { public function getUser($id, $type) { $users = $this->createQuery("SELECT u, p FROM User u JOIN u.phonenumbers p

首先,我将给出一个带有一些伪代码的示例,然后我将解释问题所在。假设我有两个实体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(使用不同的条件)并每次都获得适当的集合?

使用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() ;
}

获取、加入和过滤集合并不是很好地结合在一起的事情。以下是您应该如何做到这一点:

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

这将在第二个连接(且未水合)的p2上应用过滤,这将导致正确的水合和过滤。

该示例只是一个伪代码。问题在于条令的行为,而不是提供的代码。仍然一样,无论如何构建查询,都要使用leftJoin和WITH语句。此示例不执行fetch连接,因此PhoneNumber将被延迟加载。WITH不同时执行获取联接和筛选器。正确的答案是Ocramius'执行两个连接,一个用于筛选,一个用于获取。目前我使用的是Query::HINT\u REFRESH,我相信这会对性能产生一些影响,但我肯定会检查您的解决方案。谢谢你抽出时间。