2012-07-03 2 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

Спасибо Borislav –

0

Просто добавить вашу модель псевдоним определения поля также работает для этой цели

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