Невозможно (насколько я знаю) создавать виртуальные поля «на лету». Какими виртуальными полями являются «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);
, потому что вы находитесь в том же классе.
пожалуйста, напишите ваш код до сих пор. – Dave