2011-10-25 65 views
2

可以/應該使用任何ORM解決方案是這樣的複雜情況嗎? 甚至可以用PropelDoctrine來完成嗎?目前我正在使用Propel。所以我會很高興如果有推進解決方案。
如果我用propel進行直接查詢,有什麼建議?用於真正複雜查詢的ORM解決方案

SELECT I.*,((I.width*175)/I.height) as relativeWidth FROM 
(SELECT * FROM Image WHERE owner = 1 LIMIT 5, 10) I 
order by relativeWidth asc 

,另外什麼是其中一個需要exequte在大多數應用程序的地方非常複雜的查詢場景標準的解決方案?

有一個我用於分頁的LIMIT 5, 10。並在其內部查詢。如果它在查看如何控制分頁?

+0

相關的問題來創建複雜的查詢:HTTP://stackoverflow.com/questions/7860871/propel-pseudo-column-sorting – halfer

+0

這個問題是我也問過 –

+1

是的,我知道 - 有用的人看到它。 – halfer

回答

2

您的查詢可以寫成與波輪1.6.3如下:

<?php 

// SELECT * FROM Image WHERE owner = 1 LIMIT 5, 10 
$subQuery = ImageQuery::create() 
    ->filterByOwner(1) 
    ->limit(10) 
    ->offset(5) 
    ; 

$query = ImageQuery::create() 
    ->addSelectQuery($subQuery, 'I', true) 
    ->withColumn('((I.WIDTH*175)/I.HEIGHT)', 'relativeWidth') // ((I.width*175)/I.height) as relativeWidth 
    ->orderBy('relativeWidth') // default is 'asc' 
    ; 

$params = array(); 
var_dump(\BasePeer::createSelectSql($query, $params)); 

輸出是:

SELECT I.ID, I.WIDTH, I.HEIGHT, I.OWNER, ((I.WIDTH*175)/I.HEIGHT) AS relativeWidth 
FROM (
    SELECT image.ID, image.WIDTH, image.HEIGHT, image.OWNER 
    FROM `image` 
    WHERE image.OWNER=:p1 LIMIT 5, 10 
) AS I 
ORDER BY relativeWidth ASC 

注意:p1是與業主值綁定參數。

所以它真的很容易使用的Propel :)

威廉

0

有些查詢最好用視圖imo來修復。誠然,這不適用於ORM純粹主義者,但我發現它是一種非常可維護的方法,同時還可以獲得ORM的好處。我會說,在一個單一的項目中,你應該只有10%的時間做這個工作;如果您發現您正在編寫大部分ORM語句的視圖,那麼可能需要另一種方法。

大家都說,你舉的例子很簡單。我會傾向於在同級類中使用原始SQL編寫一個特殊的方法,並根據我的示例在相關問題中手動進行水合。請記住,在運行原始sql時,更容易陷入SQL注入 - 記住要轉義,清理或參數化變量。

+0

在ORM中使用視圖沒有任何問題,它實際上會使DBA成爲我們最好的朋友。 – AFD

+0

但在查詢中,我給出了'LIMIT 5,10'用於內部查詢的分頁,如果它在視圖中我無法控制! –

+0

請檢查我的編輯問題 –