【问题标题】:Dynamically add virtual field in cakephp在 cakephp 中动态添加虚拟字段
【发布时间】:2012-07-03 05:42:31
【问题描述】:

我使用的是 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)

【问题讨论】:

  • 请发布您的代码。

标签: cakephp cakephp-2.1


【解决方案1】:

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

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

将其写在查找查询的上方,查询将保持与编写时相同。 This link 有助于找出解决方案。

【讨论】:

    【解决方案2】:

    没有办法(据我所知)“即时”创建虚拟字段。虚拟字段是“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);
    

    因为你们在同一个班级。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2022-07-07
        • 1970-01-01
        • 2014-11-05
        • 2014-05-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多