我正在使用CakePHP 2.1.3;我想在控制器中动态创建一个虚拟字段。可能吗? 问题是当我试图在表中找到最大值时,它给出了模型数组中的另一个数组。请询问您是否需要更多信息。
当我尝试执行以下查询时,
$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 :(得分:8)
我找到了解决方案。我可以在运行时创建虚拟字段。代码应如下所示:
$this->CaseMaster->virtualFields['MAX_NO'] = 0;
将它写在查找查询的上方,查询将保持与写入时相同。 This link有助于找到解决方案。
答案 1 :(得分: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);
因为你在同一个班级。
答案 2 :(得分:0)
将模型别名添加到字段定义中也可以用于此目的
'fields' => array('max(CaseMaster.CASE_NO) AS CaseMaster__MAX_NO')