MySQL中的逻辑列 - 如何?

时间:2010-07-08 14:00:04

标签: mysql cakephp

我有一个数据模型,比方说: invoices (m:n) invoice_items 目前,我在 invoice_items 的列中存储了以PHP计算的发票总额,总计为 invoices 。我不喜欢存储派生数据,因为它为以后的错误铺平了道路。

如何在MySql的 invoices 表中创建逻辑列?这是我在PHP中处理得更好的东西(在本例中是CakePHP)吗?

4 个答案:

答案 0 :(得分:3)

CakePHP中有一些称为虚拟字段的东西,它允许您从模型中获得相同的结果,而不是依赖于MySQL的支持。虚拟字段允许您在模型中“混搭”各种数据,并将其作为记录中的附加列提供。它比其他方法更干净......(没有afterFind()黑客攻击)。

在此处阅读更多内容:http://book.cakephp.org/view/1608/Virtual-fields

答案 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)

http://forge.mysql.com/wiki/MySQL_virtual_columns_preview

它还没有实现,但它应该在mysql 6.0中实现

目前,您可以创建一个视图。