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