7

i (benim sorgu oluşturucu) büyük bir sorgu var ve sol katılır bir sürü Left ile sınırlandırılması/Sayfalandırmayı Katıldı. Bu yüzden makalelerini yorumlar, etiketler vb. Ile aldım. Varsa, ŞimdiDoctrine2: - En İyi Uygulama

$dql = 'SELECT blogpost, comment, tags 
FROM BlogPost blogpost 
LEFT JOIN blogpost.comments comments 
LEFT JOIN blogpost.tags tags'; 

benim veritabanı 100'den fazla blogposts vardır ama sadece ilk 10 tane ister diyelim, ama bu 10 tüm yorumlar ve onların tüm etiketleri ile: en i aşağıdaki DQL var diyelim . Eğer setMaxResults kullanırsam, Satırları sınırlar. Bu yüzden ilk iki Yazıyı alabilirim, ancak bunlardan sonuncusu bazı yorumları veya etiketleri eksik. Yani followin çalışmıyor. o kadar yavaş olduğu için doctrine2.2 ile gemiler gerçekten benim için çalışmıyor ancak belgelenmiş Pagination Çözüm kullanma

$result = $em->createQuery($dql)->setMaxResults(15)->getResult(); 

ya ben de tüm verileri yükleyebilir.

ben Stackoverflow Article yılında Çözümler çalıştı, ama bu bile Madde hala En İyi Uygulama eksik ve sunulan çözüm ölümcül yavaş.

Bunun nasıl yapılacağı konusunda en iyi uygulama yok mu? Üretim modunda Doctrine2.2'yi kullanan yok mu?

Sen fıkra GELEN gibi bir alt sorguyu kullanarak yerel MySQL istediğini yapabilirsin: açıklık söz ışığında

+1

Lütfen sorunuza ilişkin kodu ekleyin, belki de neyi istediğinizi göstermek için örnek sonuçlarla ve ne elde ederseniz edin. –

cevap

10

Böyle bir sorguyla uygun sonuçların elde edilmesi sorunludur. Doctrine web sitesinde bu sorunu açıklayan bir öğretici var.

Pagination

öğretici oldukça iyi 5 sonuç alma daha sayfalandırma hakkında daha fazla olduğunu, ama genel bir fikir, bir yerine "makalelerinde a ... SINIR 5 DISTINCT a.id SEÇ" yapmak gerekir olmasıdır normal bir SELECT. Bundan biraz daha karmaşık, ama bu eğitimdeki son 2 puan sizi doğru yola koymalı.

Güncelleme:

Buradaki sorun Doktrini veya başka bir ORM değildir. Sorun, veritabanında sormak istediğin sonuçları geri getirebiliyor. Bu sadece katılımcılar nasıl çalışır.

bir sorguyu AÇIKLAMAK yoksa, bu size ne olup bittiğini bir daha derinlemesine cevabı verecektir. Bunun sonuçlarını ilk sorunuza eklemek iyi bir fikir olur. Sayfalandırma makalesinde tartışılmıştır ne

Bina, istediğiniz sonuçları almak için en az 2 sorguları gerektiğini görünür. Bir sorguya DISTINCT eklenmesi, sorgunuzu önemli ölçüde yavaşlatma potansiyeline sahiptir, ancak yalnızca sizin katılımınız varsa gerçekten gerekli. Bir araya gelmeden, oluşturulan tarihe göre sipariş edilen ilk 10 gönderiyi alan başka bir sorgu yazabilirsiniz. Bu 10 yayının kimliklerini aldıktan sonra, katılmalarınızla bir başka sorgu yapın ve bir WHERE blogpost.id IN (...) ORDER BY blogpost.created. Bu yöntem çok daha verimli olmalı.İlk sorguda umurumda tüm kimlikleri olduğundan

SELECT 
    bp 
FROM 
    Blogpost bp 
ORDER BY 
    bp.created DESC 
LIMIT 10 

, sen Skaler Nemlendirici kullanmak Doctrine ayarlayabilirsiniz.

SELECT 
    bg 
FROM 
    Blogpost bp 
LEFT JOIN 
    bp.comments c 
LEFT JOIN 
    bp.tags t 
WHERE 
    bp.id IN (...) 
ORDER BY 
    bp.created DESC 

Ayrıca, ilişkili bir alt sorgu kullanarak bir sorguda da yapabilirsiniz. Alt sorguların her zaman kötü olduğu efsane doğru DEĞİLDİR. Bazen onlar birleşimlerden daha hızlıdır. En iyi çözümün sizin için ne olduğunu bulmak için denemeniz gerekir.

2

Düzenleme

SELECT * FROM 
(SELECT * FROM articles ORDER BY date LIMIT 5) AS limited_articles, 
comments, 
tags 
WHERE 
limited_articles.article_id=comments.article_id 
limited_articles.article_id=tags.article_id 

olarak bildiğim kadarıyla, DQL, bunun gibi alt sorguları desteklemez, böylece NativeQuery sınıfını kullanabilirsiniz.

+0

Hayır, benim en son M'yi istemiyorum. En son N'yi tüm M, X ve Y. ile istiyorum. –

+0

Bir DABL/ORM Framework kullanmanın büyük bir hayranı değilim ve daha sonra yerel Sorguları. Bana çok şey ifade etmiyor. –

+1

Daha sonra iki sorgu yapmanız gerekecek gibi görünüyor. Katılmaların sonuçlarını ve sonuçlarını sınırlamak için daha iyi bir yol olması gerektiğine katılıyorum. –