2012-11-28 52 views
5

首先我將舉一個僞代碼的例子,然後我將解釋什麼是問題。讓我說我有兩個實體用戶和電話號碼。他們的關係是一對多的。在我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連接(使用不同的標準)並每次都得到適當的收集?

回答

3

取得加入和過濾集合不是一起工作的很好的東西。這裏是你應該怎麼做:

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

這對第二接合部(而不是水合)p2,這會導致正確的水化和濾波應用濾波。

+0

目前我最終使用Query :: HINT_REFRESH,我相信這會對性能產生一定的影響,但是我肯定會檢查你的解決方案。謝謝你的時間。 – ventsislaf

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

這個例子只是一個僞代碼。問題在於教義的行爲,而不是在提供的代碼中。 – ventsislaf

+0

仍然如此,無論您如何構建查詢,都使用leftJoin和WITH語句。 – Zeljko

+0

示例不正確。 – Ocramius