2014-09-18 80 views
0

我使用Doctirine 2和zf2。我怎樣才能將這個SQL查詢轉換爲dql。 (Doctirine查詢語言)Doctirine 2案例陳述

我的產品實體在「應用程序\實體\產品」我已經嘗試過,但它不工作..

感謝您的幫助。

SELECT price_range, count(*) AS num 
FROM 
(SELECT CASE WHEN price >= 0 AND price <= 10 THEN '0-10' 
      WHEN price >= 10 AND price <= 20 THEN '10-20' 
      WHEN price >= 20 AND price <= 30 THEN '30-40' 
      WHEN price >= 30 AND price <= 40 THEN '30-40' 
      WHEN price >= 40 AND price <= 50 THEN '40-50' 
      WHEN price >= 50 AND price <= 60 THEN '50-60' 
      WHEN price >= 60 AND price <= 70 THEN '60-70' 
      WHEN price >= 70 AND price <= 80 THEN '70-80' 
      WHEN price >= 80 AND price <= 90 THEN '90-100' 
      WHEN price >= 100 AND price <= 110 THEN '100-110' 
      ELSE 'over 1000' 
     END as price_range 
FROM product 
WHERE 1 
) AS price_summaries 
GROUP BY price_range 

回答

0

那麼,不幸的是,你不能。學說不支持CASE。而看着你的問題,我也無法找到一個適合DQL的其他解決方案。

但是,您可以使用native query。原生查詢是嵌入的原始SQL查詢,基本上是PDO的擴展。

原生查詢當然一般不提倡,因爲他們有兩個缺點:

  1. 你必須做的水化成學說實體本身,使用ResultSetMapping(如果你想查詢的結果包含現成的實體而不是普通的數組/對象)。
  2. 原生查詢破壞了使用DBAL的全部要點:您鬆散的可移植性。 (但是,說實話,大多數項目並不只是改變他們的RDBMS,所以這是一個相當理論上的問題)。

但是,如果你需要有上面的查詢執行,使用本地查詢在這種情況下單。

+0

學說支持的情況下聲明,但我必須使用本地查詢。你可以看看我的答案。謝謝。 – Yargicx 2014-09-18 20:48:00

+0

是的,但是如果它在本機查詢中,那麼它不是DQL,就像你在你的問題中提出的那樣。 – lxg 2014-09-18 20:48:48

+0

我試過原生查詢,但它說我「原生查詢不支持繼承」...所以我用「$ em-> getConnection() - >查詢($ sql) - > fetchAll()」 – Yargicx 2014-09-18 21:50:56

0

Doctirine支持案例聲明。

這工作

SELECT CASE WHEN (p.price >= 0 AND p.price <= 10) THEN '0-10' 
          WHEN (p.price >= 10 AND p.price <= 20) THEN '10-20' 
          WHEN (p.price >= 20 AND p.price <= 30) THEN '30-40' 
          WHEN (p.price >= 30 AND p.price <= 40) THEN '30-40' 
          WHEN (p.price >= 40 AND p.price <= 50) THEN '40-50' 
          WHEN (p.price >= 50 AND p.price <= 60) THEN '50-60' 
          WHEN (p.price >= 60 AND p.price <= 70) THEN '60-70' 
          WHEN (p.price >= 70 AND p.price <= 80) THEN '70-80' 
          WHEN (p.price >= 80 AND p.price <= 90) THEN '90-100' 
          WHEN (p.price >= 100 AND p.price <= 110) THEN '100-110' 
          ELSE 'over 1000' 
         END as price_range 
         FROM \Application\Entity\Product p 

但是,這並不工作,我想我應該嘗試本地查詢

SELECT price_range, count(*) AS num 
        FROM 
        (SELECT CASE WHEN (p.price >= 0 AND p.price <= 10) THEN '0-10' 
         WHEN (p.price >= 10 AND p.price <= 20) THEN '10-20' 
         WHEN (p.price >= 20 AND p.price <= 30) THEN '30-40' 
         WHEN (p.price >= 30 AND p.price <= 40) THEN '30-40' 
         WHEN (p.price >= 40 AND p.price <= 50) THEN '40-50' 
         WHEN (p.price >= 50 AND p.price <= 60) THEN '50-60' 
         WHEN (p.price >= 60 AND p.price <= 70) THEN '60-70' 
         WHEN (p.price >= 70 AND p.price <= 80) THEN '70-80' 
         WHEN (p.price >= 80 AND p.price <= 90) THEN '90-100' 
         WHEN (p.price >= 100 AND p.price <= 110) THEN '100-110' 
         ELSE 'over 1000' 
        END as price_range 
        FROM \Application\Entity\Product p 
        ) AS price_summaries 
        GROUP BY price_range 
+0

如果它是一個本地查詢,那麼它不受Doctrine支持,但直接傳遞到您的dababase服務器。 – lxg 2014-09-18 20:49:29