与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']},虽然这显然不是最好的解决方案。这让我朝着正确的方向前进,我添加了我的解决方案。