2011-11-09 20 views
5

Uygulamamda, ilgili bir tabloda izin verilen değerlerin listesini sağlamak için kullanılan bir dizi basit referans/arama veritabanı tablosu var.Doctrine 2'de Referans/Arama Tablolarına Katılmaktan Kaçınma

(Sen ... Bir 'Ülkeler' tabloda Adres tablosunun 'Ülkenin' alanına izin verilen ülkelerde bir listesi vardır, biliyorum)

mümkün olduğunca yağsız benim veri modeli kulak olsun diye Arama tablosundaki 'id' sütununu atlamanın ve sadece gerçek değeri birincil anahtar olarak kullanarak "Bill Karwin technique" kullanın. Bu şekilde, ana tablodaki değeri almak için bir katılma yapmanız gerekmez, çünkü zaten yabancı anahtar olarak var.

Sorun şu ki, Doctrine, tüm ilişkilendirmeler için nesne başvuruları kullanır; bu, sorguların ana tablodaki değerlere zaten sahip olsa bile arama tablolarına hala katılmalarını gerektirdiği anlamına gelir.

Örneğin, bu sorgu çalışmaz:

$qb->select(array('a.id', 'a.street', 'a.city', 'a.country')) 
    ->from('Entity\Address', 'a'); 

Bunun yerine, bunu yapmak zorunda:

$qb->select(array('a.id', 'a.street', 'a.city', 'c.country')) 
    ->from('Entity\Address', 'a') 
    ->join('a.country', 'c'); 

Aksi halde bu hatayı alıyorum:. "Geçersiz PathExpression bir StateFieldPathExpression olmalı ."

Arama tabloları için gereken tüm birleşimleri ekleyin ve sorgularımda çok fazla gereksiz maliyet var.

Doctrine 2'deki arama/referans tablolarına katılımları gerçekleştirmek zorunda kalmaktan kaçınmanın iyi bir yolu var mı?

(PS -. Onlar not supported by Doctrine konum ve diğer well-documented disadvantages var gibi ben Numaralamalar kullanmaktan kaçınmak tercih ediyorum)

cevap

6
Evet, bu tür berbat

, ama onlar bunu yapmak için iyi bir nedeni vardı sanırım yol.

HINT_INCLUDE_META_COLUMNS ipucunu kullanabilirsiniz. İlişkiler olarak eşleştirilen yabancı anahtarlar dahil olmak üzere sorgu sonucundaki tüm alanları içerecektir.

$query = \Doctrine::em()->createQuery($queryString) 
    ->setParameters($params) 
    ->setHint(\Doctrine\ORM\Query::HINT_INCLUDE_META_COLUMNS, TRUE); 

Yani bir sahadan db Address tabloda city_id var senin eğer, o da "standart" Şehir ilişkisi ile birlikte, sorgu sonucunda outputted edilecektir.

+0

Bu harika - setHint() yöntemini bilmiyordum ve iyi kullanıma sunmayı planlıyorum. – cantera

+1

İpucu ipucu, yalnızca meta sütunları içermekle kalmayacak şekilde, her tür malzeme için kullanılır. Her sorgunuzu yürüten bir sorgu yürüteç eklemenin bir yoludur. İstediğinizi yapan kendi ipuçlarınızı da yapabilirsiniz. Güzel küçük bir şey değil;) – ZolaKt

+0

Uyarı: Doktrin, null'u tutan yabancı anahtarları içermez. City_id zorunlu değilse, her zaman mevcut olmayacaktır. Sadece 2 saat harca, bunun önbellek problemi olduğunu düşünüyorum :) –