6

最初にいくつかの擬似コードを使用して例を示し、次に何が問題なのかを説明します。UserとPhonenumberの2つのエンティティがあるとしましょう。それらの関係は1対多です。私の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.

だから私の質問は:フェッチ結合を使用して(異なる基準で)、毎回適切なコレクションを取得することは可能ですか?

4

2 に答える 2

7

コレクションのフェッチ結合とフィルタリングは、うまく連携するものではありません。これがあなたがそれをするべき方法です:

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

これにより、2番目に結合された(水和されていない)フィルタリングが適用されp2、正しい水和とフィルタリングが行われます。

于 2012-12-01T03:33:53.633 に答える
-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() ;
}
于 2012-11-28T12:17:05.027 に答える