2011-09-14 15 views
6

Ben Symfony2'de ve Doktrin ile uygulama geliştiriyorum ve bir tablo çağrıda ben gibi konum ve tarih kitaplarını saklamak durum:Doctrine'deki sadece son güncellenmiş kayıtlar nasıl eşleştirilir?

ID | Book  | Date  | Location 
------------------------------------------------ 
1 | Book_1  | 2011-08-29 | Home 
2 | Book_1  | 2011-08-30 | Office 
3 | Book_1  | 2011-09-02 | Friend's House 
4 | Book_2  | 2011-09-02 | Office 
5 | Book_2  | 2011-09-04 | Home 

en son tarihli durum rekor temsil o kitabın mevcut (veya son bilinen) konumu. Yukarıdaki örnekte, Book_1 şu anda "Friend's House" içinde ve Book_2 "Home" içinde.

Aşağıdaki kod bir noktada "Ev" bir yer vardı herhangi kayıtlarını alır: Yerine

$em = $this->getEntityManager(); 
$query = $em->createQuery('SELECT s FROM myBookTestBundle:Status s WHERE s.location=:x')->setParameter('x', 'Home'); 
$status = $query->getResult(); 

, Kimin akım konum "Ev" eşleşmesi o kitapları seçmek istiyorum . Yukarıdaki örnekte, bu sadece kayıt ID = 5 (Book_2) olacaktır.

DQL ile bunu kolayca yapmanın bir yolu var mı?

Her türlü yardım büyük beğeni topluyor.

sayesinde
Ralph

cevap

2

diğer soru: "Doctrine2 en DQL subselects idare edebilir?".

MySQL için sorgu olacaktır: Cevabınız için

select ID,Book,`Date`,Location 
    from Status a 
    where `Date` = 
    (select max(`Date`) from Status group by Book having Book = a.Book) 
    and Location = 'Home'; 
2

teşekkürler. Ben de şu kaynak bulundu: http://dev.mysql.com/doc/refman/5.0/en/example-maximum-column-group-row.html

Ve düzgün çalıştığını aşağıdaki DQL içine bu uyum başardı:

SELECT s1 FROM myBookTestBundle:Status s1 WHERE s1.Location=:location 
AND s1.Date=(SELECT MAX(s2.Date) FROM myBookTestBundle:Status s2 WHERE s1.Book=s2.Book) 

Ancak, yukarıda makaleye göre, bir ilintisiz kullanmak daha verimlidir SOL JOIN ile alt sorgu. Ama eğer DQL eşdeğerini yazmaya çalışırsam, bir hata alıyorum. Doctrine'nin FROM/JOIN ifadelerinde alt sorguları desteklemediğini bir yerde okudum.

Bunu doğrulayan var mı? Yukarıdaki DQL'i mümkün olduğunca verimli hale getirmenin herhangi bir yolu var mı?

Tekrar teşekkürler,
Ralph

İlgili konular