2012-07-03 63 views
0

我正在使用CakePHP 2.1.3;我想在控制器中動態創建一個虛擬域。可能嗎? 問題是,當我試圖在表中查找最大值時,它會從模型數組中提供另一個數組。請詢問您是否需要更多信息。在cakephp中動態添加虛擬域

當我試圖執行以下查詢,

$find_max_case_count = $this->CaseMaster->find('first', array(
    'conditions' => array(
     'CaseMaster.CLIENT_ID' => $client_id, 
     'CaseMaster.CASE_NO LIKE' => '%-%' 
    ), 
    'fields' => array('max(CaseMaster.CASE_NO) AS MAX_NO') 
)); 

這是給我這樣一個數組:

[0]=> array([MAX_NO]=> 52) 

但是我希望它像爲:

[CaseMaster] => array([MAX_NO] => 52) 
+0

請把你的代碼迄今。 – Dave

回答

8

我找到了解決方案。我可以在運行時創建虛擬域。代碼應該是這樣的:

$this->CaseMaster->virtualFields['MAX_NO'] = 0; 

寫它只是查找上面的查詢,查詢將保持相​​同的,因爲它是寫的。 This link有助於找出解決方案。

3

沒有辦法(據我所知)創建虛擬領域「在飛行中」。虛擬域是「arbitrary SQL expressions」,當查找遍歷模型時將執行,並且「將在模型的關鍵字和其他模型域下進行索引」。

你需要做什麼「動態創建虛擬領域」?如果你解釋一下你需要完成什麼,也許我們可以提供一個不同的(甚至更合適的:) :)解決方案?我個人很樂意幫助你。

在你編輯你的問題後,我可以說你得到的是數組應該返回的方式,這是因爲fields參數。如果你想得到一個不同的結構,我建議應用回調來設置它的格式。 首先移動CaseMaster Model裏面的方法:

public function getMaxCaseCount($client_id){ 
$data = $this->find('first', array(
        'conditions' => array(
            'CaseMaster.CLIENT_ID' => $client_id, 
            'CaseMaster.CASE_NO LIKE' => '%-%'), 
        'fields' => array('max(CaseMaster.CASE_NO) AS MAX_NO'))); 
return array_map(array('CaseMaster', '__filterMaxCaseCount'), $data); 
} 

private function __filterMaxCaseCount($input){ 
    //This is just an example formatting 
    //You can do whatever you would like here. 
    $output['CaseMaster'] = $input[0]; 
    return $output; 
} 

array_map功能將應用__filterMaxCaseCount回調方法,這樣,當你撥打:

$this->CaseMaster->getMaxCaseCount($client_id); 

從你的控制器,你將獲得數據的方式你需要它。該array_map功能也可以是這樣的:

return array_map(array($this, '__filterMaxCaseCount'), $data); 

,因爲你在同一類是。

+0

我編輯了我的問題。請再次查看。謝謝。 –

+0

現在來看看。 –

+0

感謝鮑里斯拉夫 –

0

只是增加你的模型別名字段定義也適用於這一目的

'fields' => array('max(CaseMaster.CASE_NO) AS CaseMaster__MAX_NO')