2013-03-23 45 views
1

在mu ZF2項目中,我有使用TableGateway的Model。 內部函數負責根據搜索條件(城市,郵政編碼,範圍,類型)提取對象。ZF2其中表達式

一般來說,我通過簡單的

$rowset = $this->tableGateway->select($where); 

獲取數據的行。在我的MySQL數據庫中,我有程序GetObjectsInCityRange(市,範圍)返回所有的object_id中的地理編碼的城市的座標範圍

我打算在where子句中添加條件:

WHERE object_id IN (call GetObjectsInCityRange(city, range)) 

是否可以使用MySQL?如何正確寫入數組元素以使其工作?

回答

1

您可以在您選擇的對象中調用where()方法,並在返回值上調用in()或創建where語句。

E.g.

$select = new Select(); 
$select->from($this->tableName)->columns(array($expression)); 
$where = new Where(); 
$where->in($identifier, $valueSet); 
// or 
$where->addPredicate(
    new Predicate\In($identifier, $valueSet) 
); 
// and then 
$select->where($where); 

並將其追加到選擇對象。

下面的鏈接正是你需要什麼,我相信:) http://framework.zend.com/manual/2.1/en/modules/zend.db.sql.html#in-identifier-array-valueset-array

希望這有助於:)

0

對於MySQL,建議你應該使用,而不是過程函數功能可以用在任何sql查詢while過程本身就是一個查詢語句。防爆。

call MyPrcedure(); 

SET var = MyFunction(); 

所以你可以在你的查詢大部分時間調用函數。然而,根據我的知識函數將返回有效的mysql數據類型如varchar,int float等。因此查詢行可能無法在您的In查詢中可用。然後,只有這樣才能執行查詢,將您的過程邏輯轉換爲子查詢並傳入IN語句。

WHERE object_id IN (SUB_QUERY) 
+0

我發現在MySQL中以這種方式解決這個問題太複雜了,例如在Firebird中,我的SUB_QUERY會很簡單''SELECT object_id from SP'。 – GregGy 2013-04-05 18:08:00

+0

我發現在MySQL中解決這個問題太複雜了,例如在Firebird中,我的SUB_QUERY會很簡單'SELECT object_id from SP'我通過生成每個object_id和city之間的距離。接下來我加入兩個表並將結果限制在所需的距離範圍內。 – GregGy 2013-04-05 18:14:37