2013-04-25 71 views
4

使用Propel 1.6提供的方法重寫簡單查詢時遇到了一些麻煩。使用Propel選擇特定列而不使用別名

查詢如下:

SELECT type_id, COUNT(id) as `count` FROM visit GROUP BY type_id; 

使用行走,我寫了以下內容:

$visitCount = VisitQuery::create() 
       ->withColumn('COUNT(id)', 'count') 
       ->groupBy('TypeId') 
       ->find(); 

這將生成以下查詢:

SELECT visit.ID, visit.JOB_ID, visit.ENGINEER_ID, 
     visit.TYPE_ID, visit.VISIT_DATE, visit.STATUS, COUNT(id) AS count 
FROM `visit` 
GROUP BY visit.TYPE_ID 

其中一期工程,但我只需要列type_idcount,所以我嘗試添加以下內容:

$visits = VisitQuery::create() 
      ->withColumn('COUNT(id)', 'count') 
      ->select(array('TypeId')) 
      ->groupBy('TypeId') 
      ->find(); 

這將生成以下(工作)查詢:

SELECT COUNT(id) AS count, visit.TYPE_ID AS "TypeId" 
FROM `visit` GROUP BY visit.TYPE_ID 

不過,我不想別名type_id列。我試圖通過實際的列名的select陣列(->select(array('type_id'))),但其導致下面的查詢(這顯然是行不通的):

SELECT COUNT(id) AS count, AS "type_id" FROM `visit` GROUP BY visit.TYPE_ID 

我怎樣才能找回type_id列而不會被混淆?

回答

3

Propel將列名抽象化,以便您的PHP不一定需要了解它們。

PropelORM.org

操縱物體的型號名稱可以讓你從 實際數據存儲被分離,並改變數據庫名稱,而不必 更新PHP代碼。

TypeID將是什麼phpName等於你的模式。嘗試使用這個而不是mysql列名。考慮到這一點,如果你真的想要使用列的實際名稱,你可以使用propel的introspection classes來實現。例如:

var_dump(VisitPeer::getTableMap()->getColumnByPhpName('TypeId')->getName()); 
var_dump(VisitPeer::getTableMap()->getColumn('type_id')->getPhpName()); 

但隨着documentation本身說:

記住,總是使用phpName在PHP代碼

+4

或者你也可以用'VisitPeer :: TYPE_ID' ......這是一個快捷方式欄名稱基於定義的模式名稱。 – jakerella 2013-04-25 14:20:52

+0

如果他將db列更改爲'my_type_id',那麼VisitPeer :: TYPE_ID仍然可用(並指向列)? – LeonardChallis 2013-04-25 14:52:51

+0

不,如果他計劃改變列名並且不讓phpName改變,那麼你的方法是最好的。 (和FYI,你的方法是不錯的,這就是爲什麼我的輸入不是一個單獨的答案,只是一個側面說明:)) – jakerella 2013-04-25 15:22:31

2

你顯然試圖查詢數據,不與您的商業模式進行互動。因此,在這種情況下使用ORM可能會適得其反。我建議你使用普通的舊PDO(Propel封裝)這種邏輯。

我建議在行走博客這個資源解答有關如何編寫特殊查詢與ORM最常見的問題:http://propel.posterous.com/how-can-i-write-this-query-using-an-orm

+0

不幸的是,** Posterous Spaces不再可用** – 2015-01-22 13:55:17

+2

它已在多年前遷移到http://propelorm.org/blog/2011/02/02/how-can-i-write-this-query-using-an-orm-.html – 2015-01-23 14:28:48