学说抓取连接(Doctrine fetch join)

2019-08-03 06:27发布

首先,我会给与一些伪代码的例子,然后我会解释这是什么问题。 让我说,我有两个实体的用户和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连接(使用不同的标准),每次得到适当的收集?

Answer 1:

取加入和滤波合集不是东西,合作良好。 这里是你应该怎么做:

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

这适用于第二滤波接合(并且不水合的) p2 ,这导致正确水合和滤波。



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


文章来源: Doctrine fetch join