2012-11-28 23 views
5

İlk önce bazı sözde kodlarla bir örnek vereceğim ve sonra sorunun ne olduğunu açıklayacağım. İki varlığımın Kullanıcı ve Telefon Numarası olduğunu söyleyeyim. İlişkileri bire çoktur. Ben böyle bir şey varsa benim appDoctrine Getir

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]; 
    } 
} 

: Yani

$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. 

sorularım geçerli: Benim UserRepository ben böyle bir şey olabilir o (farklı kriterlere göre) katılmak getirme kullanmak mümkün mü ve her seferinde doğru koleksiyonu almak için?

cevap

3

Bir koleksiyona katılmak ve filtrelemek, birlikte iyi çalışan şeyler değildir. İşte bunu nasıl açıklanmıştır:

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

Bu, doğru hidrasyon ve filtreleme, bunun sonucunda katıldı (ve sulu değil) p2 ikinci üzerindeki filtrelemeyi uygular.

+0

Şu an için bazı performans etkilerine sahip olacağımı düşündüğüm Query :: HINT_REFRESH kullanarak bitirdim, ama kesinlikle çözümünüzü kontrol edeceğim. Zaman ayırdığın için teşekkürler. – ventsislaf

-2

Sorgulayıcı kullan, bu çok daha basit.

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

Örnek, yalnızca sözde bir koddur. Sorun, verilen kodda değil, öğretinin davranışındadır. – ventsislaf

+0

Yine de, sorguları nasıl oluşturursanız olun, leftJoin ve WITH deyimini kullanın. – Zeljko

+0

Örnek yanlış. – Ocramius