与GROUP BY关联的模型的CakePHP和

与GROUP BY关联的模型的CakePHP和,cakephp,model,cakephp-2.2,Cakephp,Model,Cakephp 2.2,我有一个发票模型,它有很多费用。每次我收到发票时,它都会返回所有相关的费用(Charge是一个属于发票的模型)。我还想返回每张发票上所有费用的总额 我尝试使用以下虚拟字段,但它返回了所有费用的总和(不是通过发票) 我的虚拟字段是否不正确(我假设它需要一个分组依据位置)?在我的模型中有更好的选择吗 我使用的是CakePHP 2.2。这是直接取自CakePHP书籍: virtualFields的局限性 virtualFields的实现有一些限制。弗斯特 您不能在条件的关联模型上使用virtualFi

我有一个
发票
模型,它有很多费用。每次我收到发票时,它都会返回所有相关的费用(
Charge
是一个
属于发票的模型)。我还想返回每张发票上所有费用的
总额

我尝试使用以下虚拟字段,但它返回了所有费用的总和(不是通过发票)

我的虚拟字段是否不正确(我假设它需要一个
分组依据
位置)?在我的模型中有更好的选择吗


我使用的是CakePHP 2.2。

这是直接取自CakePHP书籍:

virtualFields的局限性
virtualFields
的实现有一些限制。弗斯特 您不能在条件的关联模型上使用
virtualFields
, 顺序或字段数组。这样做通常会导致SQL错误 错误,因为ORM未替换字段。这是因为 难以估计关联模型可能存在的深度 找到了

此实现问题的常见解决方法是复制
virtualFields
在运行时根据需要从一个模型切换到另一个模型 要访问它们,请执行以下操作:

<?php
$this->virtualFields['full_name'] = $this->Author->virtualFields['full_name'];

这直接取自CakePHP书籍:

virtualFields的局限性
virtualFields
的实现有一些限制。弗斯特 您不能在条件的关联模型上使用
virtualFields
, 顺序或字段数组。这样做通常会导致SQL错误 错误,因为ORM未替换字段。这是因为 难以估计关联模型可能存在的深度 找到了

此实现问题的常见解决方法是复制
virtualFields
在运行时根据需要从一个模型切换到另一个模型 要访问它们,请执行以下操作:

<?php
$this->virtualFields['full_name'] = $this->Author->virtualFields['full_name'];

我通过在我的
发票
模型中使用
afterFind
回调找到了答案。下面是我正在使用的函数:

public function afterFind($results) {
    foreach ($results as $key => $val) {
        if (isset($val['Charge'])) {
            $total = 0;
            foreach ($val['Charge'] as $charge) {
                $total += $charge['amount'];
            }
            $results[$key]['Invoice']['total_charges'] = $total;
        }
    }
    return $results;
}

我在我的
发票
模型中使用
afterFind
回调找到了答案。下面是我正在使用的函数:

public function afterFind($results) {
    foreach ($results as $key => $val) {
        if (isset($val['Charge'])) {
            $total = 0;
            foreach ($val['Charge'] as $charge) {
                $total += $charge['amount'];
            }
            $results[$key]['Invoice']['total_charges'] = $total;
        }
    }
    return $results;
}

是的,也许我应该通过afterFind回调进行调整?我尝试通过afterFind让它工作,但在让它返回正确的数组结构时遇到了一些困难,也许你可以使用它,但你也可以使用foreach($invoice['Charge']as$Charge){$total+=$Charge['amount']}在视图中,虽然这显然不是最好的解决方案,但这让我朝着正确的方向前进,我添加了我的解决方案。是的,也许我应该通过afterFind回调进行调整?我尝试通过afterFind使其工作,但在使其返回正确的数组结构时遇到了一些困难,也许你可以玩玩它,但你也可以在视图中使用foreach($invoice['Charge']as$Charge){$total+=$Charge['amount']},虽然这显然不是最好的解决方案。这让我朝着正确的方向前进,我添加了我的解决方案。