2013-02-19 7 views
7

Doctrine 2.1'de OOP doğruluğunun sonucu olabilecek ciddi bir işlevsellik eksikliği ile ilgili pek çok cevaba baktım. ilişkisel akıl yürütme.Doctrine 2.1 Burada yabancı anahtar kimliği = ?, Düzenleme: Sabit Doktrinde 2.2

Çoktan bir ilişki, Makaleler ve Üyeler içeren iki tablo var. Bir üye birçok yayınlanan makaleye sahip olabilir. sahibi olan tarafında ek açıklama ı üyesi 6 için tüm aktif makaleleri almak istiyorum

/** 
* @var \Member 
* @ORM\ManyToOne(targetEntity="Member") 
* @ORM\JoinColumns({ 
* @ORM\JoinColumn(name="member_id", referencedColumnName="id") 
* }) 
*/ 
private $member; 

olduğunu bu SQL basit bir sorgu: Ben idi

$rep = $this->getDoctrine()->getRepository('SMWMemberBundle:Article'); 
$q = $rep->createQueryBuilder('a') 
    ->leftJoin('a.member','m')  
    ->where('m.id = ?1') 
    ->andWhere('a.active = 1') 
    ->orderBy('a.id', 'DESC') 
    ->setParameter(1, $id)  
    ->getQuery(); 
ile sona

SELECT * FROM mbr_article 
    WHERE active = 1 AND member_id = 6 
    ORDER BY article_id DESC 

oluşturulan

SELECT m0_.id AS id0, m0_.active AS active1, m0_.update_time AS update_time2, 
     m0_.content AS content3, m0_.member_id AS member_id4 
    FROM mbr_article m0_ 
    LEFT JOIN mbr_member m1_ ON m0_.member_id = m1_.id 
    WHERE m1_.id = ? AND m0_.active = 1 
    ORDER BY m0_.id DESC 

ve muhtemelen çok daha yavaş çalışıyor, ancak daha önce Üye nesnesine sahip olduğum için JOIN'e gerek yok. Diğer yolu denediğimde, tüm makaleleri sadece aktif olanları değil.

getEntityIdentifier'u kullanan Can you get a foreign key from an object in Doctine2 without loading that object? gibi yanıtları gördüm ve 2.2'de IDENTITY(member) diyebilirim.

Doktrin 2.1'de bunu yapmak için makul bir yol var mı? Geliştirme, sorgu oluşturucuda andWhere('IDENTITY(member) = ?')'a izin verecek mi?

Düzenleme: @Ocramius için

Teşekkürler, -> ('? KİMLİK (a.member) = 1') Doktrin çalışma 2.2

+0

İlk, 2.1 artık destek yok düşünün: yükseltmeyi düşünmelisiniz. Her neyse, tanımlayıcıyı bir proxy'den geri almak, yöntem adı "alınıyorsa" yüklenmesine neden olmaz. ucfirst ($ alanAdı) ' – Ocramius

+0

@Ocramius Teşekkür ederiz,' -> nerede ('KİMLİK (a.member) =? 1') 'Doctrine 2.2'de çalışıyor mu, lütfen bunu bir cevap olarak gönderir misiniz ve kabul edeceğim . –

+0

Kendiniz ekleyin ve çözümü kendiniz bulduktan sonra kabul edin;) – Ocramius

cevap

20

KİMLİK hükümler sorgu oluşturucu tarafından oluşturulan NEREDE işlerini yapar Doktrin 2.2 örn.

$q = $rep->createQueryBuilder('a') 
    ->where('IDENTITY(a.member) = ?1') 
    ->andWhere('a.active = 1') 
    ->orderBy('a.id', 'DESC') 
    ->setParameter(1, $id)  
    ->getQuery(); 

aşağıdaki SQL üretir: Her şeyden

SELECT m0_.id AS id0, m0_.active AS active1, m0_.update_time AS update_time2, 
     m0_.content AS content3, m0_.member_id AS member_id4 
    FROM mbr_article m0_ 
    WHERE m0_.member_id = ? AND m0_.active = 1 
    ORDER BY m0_.id DESC