2010-09-09 17 views
7

Benim komut dosyası aşağıdaki gibidir:Sütun takma adı doktrinde neden çalışmaz?

$query = Doctrine_Query::create() 
    ->select('count(p.product_id) as num_a')    
    ->from ('ProductComments p') 
    ->groupBy('p.product_id') 
    ->having('num_a =2 '); 

Ve oluşturulan sql geçerli: sql çalıştırmak zaman

SELECT COUNT(i.product_id) AS i__0 FROM productcomments i GROUP BY i.product_id HAVING num_a=2 

Böylece bir hata alıyorum.

iki soru var:

  1. neden masanın 'i' yerine 'p' takma ad?

  2. 'num_a' neden olan tümcede 'i__0' ile değiştirilmiyor, nasıl düzeltilir? Öneriniz için

Teşekkür ...

cevap

7

1: neden masaya 'i' yerine 'p' ve ait diğer adıdır?

2: Neden 'num_a' öğesi, 'i__0' ile değiştirilmediyse, nasıl düzeltilir?

Her iki soru da basitçe yanıtlanır: Doktrin, sorgu için kendi takma adlarını kullanır. Bu takma adları bilmenize gerek yoktur çünkü sizi etkilemeyecekler ya da onunla çalışmanız gerekecek.

Doctrine, i__0 takma adını adlandırmasına rağmen, özniteliğe özel takma adınızla erişebilirsiniz, örn. $yourObject->num_a uygun değere, yani count(p.product_id) sonucuna sahip olacaktır.

Sorgunuzun çıktısını görmek yararlı bir hata ayıklama özelliğidir, ancak uygulamanızın içerisine güvenmek, bu değerler yalnızca Doktrin iç mekanizmaları için kullanıldığından anlamsızdır.

+0

Yanıtınız için teşekkür ederiz. Oluşturulan takma adın bilinmesinin gerekli olmadığını size tamamen katılıyorum. Bana göre bulmaca sayım (p.product_id) i__0 olduğundan, i__0 "num_a" yerine yan tümcesinde kullanılmalıdır. – user443281

+1

Bunun eski bir gönderi olduğunu biliyorum, ancak bugün bu tökezledim ve bu iç tablo takma eşleştirmesinin yollandığı durumlar olduğunu belirtmek istedim - İçerisinde() gibi bir SQL işlevini kullanırsanız Fonksiyonun paramları içerisinde Doktrin takma adlarını kullan. –

6

Ayrıca diğer ad ayarlama ile ilgili bir sorun yaşadım. Takma ad ayarlamak ve daha sonra bu ad ile "ORDER BY" kullanmam gerekiyordu. ardından çözüm benim için çalıştı: Sonuç sorguda

$myQuery->addSelect('(<my select>) AS my_alias'); 
$myQuery->orderBy('my_alias'); 

"p_0" TARAFINDAN p_0 ... SİPARİŞ OLARAK (...) gibi görünüyordu. Umarım birisine yardım eder.

1

Bu geçerli bir SQL değil.

SQL standardı, SELECT'in,having'dan sonra mantıksal olarak yürütüldüğünü belirtir. Bu nedenle, having numaralı takma addaki kodu tekrarlamanız gerekir.

İyi tavsiyeler. SQL tüketen DB'lerle çalıştığınız sürece, SQL'e olabildiğince yakın bir şekilde bağlanın.