在cakephp中动态添加虚拟字段

问题描述 投票:0回答:3

我使用的是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)
php cakephp cakephp-2.1
3个回答
8
投票

我找到了解决办法。我可以在运行时创建虚拟字段。代码应如下所示:

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

将其写在查找查询上方,查询将与编写时保持相同。 此链接有助于找到解决方案。


3
投票

(据我所知)没有办法“即时”创建虚拟字段。虚拟字段是“任意 SQL 表达式”,当查找运行模型时将执行该表达式,并且“将在模型的键下与其他模型字段一起建立索引”。

“动态创建的虚拟字段”需要做什么?如果您解释一下您到底需要完成什么,也许我们可以提供不同的(甚至更合适?:))解决方案?我个人很乐意帮助您。

编辑问题后,我可以说您得到的是返回数组的方式,这是因为 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
投票

只需将模型别名添加到字段定义中也可以达到此目的

'fields' => array('max(CaseMaster.CASE_NO) AS CaseMaster__MAX_NO')
© www.soinside.com 2019 - 2024. All rights reserved.