呈现不在数据库中的计算值

时间:2010-06-29 16:10:54

标签: cakephp

我有一个简单的表,其中包含3个值原则,兴趣,期限。我想展示这3个值 在表格中以及计算的简单兴趣。此兴趣仅供显示,不会存储在数据库中。我怎样才能实现这一目标?我知道我可以使用Javascript计算兴趣并渲染它,但是我可以通过Cakephp来实现吗?

6 个答案:

答案 0 :(得分:3)

你可以做的一些事情。一种是在数据库中计算它。如果你能做到这一点,这是最佳的(IMO,我更喜欢尽可能多地将数据逻辑推送到数据库。)当然,如果你正在进行复杂的计算,并且数据库可扩展性是一个很快就会遇到的问题,你可以通过将其置于代码中来缓解数据库的负载。

选项2是在显示它之前计算它。在视图中,只需编写PHP代码即可计算出您需要的内容。这可能有点笨拙,具体取决于您显示此(计算)数据的频率。

选项3是在模型中进行相同的计算。这可能是最像蛋糕的方式。覆盖模型的afterFind()方法,只需对检索到的数据运行计算。根据需要添加新的数组索引。然后,只要任何控制器/视图从您的模型请求数据,所述数据将与计算的行一起返回。这很可能是我实施它的方式。

答案 1 :(得分:3)

点击此链接:Virtual fields

基本上,您可以在模型中定义虚拟字段,并可以将它们用作控制器和视图中的常规字段。您也可以在分页中使用它们:)

答案 2 :(得分:1)

您可以在SQL select语句中执行此操作,例如:

select Principle, Interest as [interest rate], Period, 
       principle * interest * period / 12 as [Interest Amount] 
    from your_table

当它回到PHP时,这看起来就像你从一个有四列而不是三列的表中选择的那样(即,计算出的值与其他列看起来没什么不同)。

答案 3 :(得分:0)

在视图中:

<?php echo $a * $b / $c ?>

OR

在控制器中:

$calcVal = $a * $b / $c;
$this->set('calcVal');

然后在视图中:

<?php echo $calcVal ?>

或上面列出的任何选项。

对于我在视图中有值的简单东西,我会选择第一个。另一方面,对于使用我在视图中无法使用的值的复杂计算,我会选择第二个。

答案 4 :(得分:0)

http://book.cakephp.org/2.0/en/models/callback-methods.html#afterfind

class Account extends AppModel {

    public $name = "Account";

    public function afterFind( $results, $primary = false ){

        parent::afterFind( $results, $primary );
        if( $primary ){
            foreach( $results as $key => $value ){
                if( isset( $value[ $this->alias ] )){
                    // set the a new index for each row returned to the value of Account::__calculateSomething at the correct key
                    $results[ $key ][ $this->alias ][ 'calulated_field_name' ] = $this->__calculateSomething( $results[ $key ][ $this->alias ] );
                }
            }
        }
        return $results;
    }
}

只需在帐户模型的__calulateSomething($ data)函数中进行聚合或计算。

这只是一个示例,但它显示了如何使用传递给afterFind回调的$ primary参数(意味着直接对此模型进行的查找调用触发了afterFind,而不是作为关联的一部分。)

您可能需要检查数组的格式 - 我在这里没有这样做。

答案 5 :(得分:0)

使用虚拟字段

可以更轻松地从数据库进行计算

看到这个

http://book.cakephp.org/view/1588/virtualFields