我有一个数据模型,比方说: invoices (m:n) invoice_items
目前,我在 invoice_items
的列中存储了以PHP计算的发票总额,总计为 invoices
。我不喜欢存储派生数据,因为它为以后的错误铺平了道路。
如何在MySql的 invoices
表中创建逻辑列?这是我在PHP中处理得更好的东西(在本例中是CakePHP)吗?
答案 0 :(得分:3)
CakePHP中有一些称为虚拟字段的东西,它允许您从模型中获得相同的结果,而不是依赖于MySQL的支持。虚拟字段允许您在模型中“混搭”各种数据,并将其作为记录中的附加列提供。它比其他方法更干净......(没有afterFind()黑客攻击)。
答案 1 :(得分:2)
利奥,
您可以做的一件事是修改模型中的afterFind()方法。这会在您检索发票的任何时候重新计算总计(计算运行时处理成本),但这意味着您不会将其存储在发票表中,这显然是您想要避免的(如果我错了,请更正)。
试试这个:
class Invoice extends AppModel {
// .. other stuff
function afterFind() {
parent::afterFind();
$total = 0;
foreach( $this->data['Invoice']['InvoiceItems'] as $item )
$total += ($item['cost'] * $item['quantity']);
$this->data['Invoice']['total'] = $total;
}
}
我可能搞乱了hasMany关系(foreach行)上的数组,但我希望你能得到它的数据。 HTH,
特拉维斯
答案 2 :(得分:1)
您可以通过
返回派生的那个SELECT COUNT(1) as total FROM invoice_items
或者,如果发票可以是多个,
//assuming that invoice_items.num is how many there are per row
SELECT SUM(num) as total FROM invoice_items
或者您可以使用VIEW,如果您有某种方式希望它始终显示。
答案 3 :(得分:1)