MySQL中的逻辑列-如何实现?

MySQL中的逻辑列-如何实现?,mysql,cakephp,Mysql,Cakephp,我有一个数据模型,比如:发票(m:n)发票\u项目 目前,我将发票总额存储在发票中的一列中,通过合计发票项目,以PHP计算。我不喜欢存储派生数据,因为它为以后的错误铺平了道路 如何在MySql中的发票表中创建逻辑列?这是不是我在PHP中处理得更好一些(在本例中是CakePHP)?您可以在需要时通过 SELECT COUNT(1) as total FROM invoice_items 或者如果发票可以是多张 //assuming that invoice_items.num is how ma

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


如何在MySql中的发票表中创建逻辑列?这是不是我在PHP中处理得更好一些(在本例中是CakePHP)?

您可以在需要时通过

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

或者,如果您希望始终以某种方式表示视图,则可以使用该视图。

或者您可以在需要时通过

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
或者,如果您希望始终以某种方式表示视图,则可以使用视图。

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

当前您可以创建一个视图。

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

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

Leo

可以做的一件事是修改模型中的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行)上的数组搞砸了,但我希望你能得到它的jist。嗯,

特拉维斯

利奥

可以做的一件事是修改模型中的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行)上的数组搞砸了,但我希望你能得到它的jist。嗯,


Travis

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


阅读更多信息:

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


在这里阅读更多信息:

这非常有效,但这是一种编程解决方案。有没有办法将该查询存储为列?这很好,但这是一种编程解决方案。有没有办法将该查询存储为列?这可能是一个选项。。。我喜欢视图,但我真的希望它作为记录中的一个字段。。。我喜欢视图,但我真的希望将其作为记录中的一个字段。这是一个很好的建议。虽然如果有很多记录,它可能会变得笨拙,但至少它是一个
CakeWay
我想我可能会用这个-谢谢。至少当我重建了我的ubuntu盒子,它神秘地占据了我眼前大约15GB的磁盘时,我会这么做。可能与我们昨天的断电有关:(我喜欢这个解决方案伪造表格的方式——蛋糕方式。我会称之为“黑客”方式,而不是“蛋糕”方式。请参阅我关于虚拟字段的答案。同意,如果你做像这样简单的事情,虚拟字段方法可能会更好。我认为afterFind()给你多一点灵活性,这可能是好的/坏的,取决于编码者/应用程序。普莱瑟,对你的答案投了赞成票。这是一个很好的建议。虽然如果有很多记录,它可能会变得很难处理,但至少它是一个
CakeWay
我想我可能会这样做-谢谢。至少当我重建我的ubuntu时我会这样做盒子在我眼前神秘地吞噬了大约15GB的磁盘。这可能与我们昨天的断电有关:(我喜欢这个解决方案以蛋糕的方式伪造桌子。我认为这更像是一个黑客而不是“蛋糕”是的。请看我关于虚拟字段的回答。同意,如果你做的是像这样简单的事情,虚拟字段方法可能会更好。我认为afterFind()为您提供了更多的灵活性,根据编码器/应用程序的不同,这可能是好的,也可能是坏的。对您的答案进行了投票,仅为placer.1.3,但值得了解。仅为placer.1.3,但值得了解。