保持afterFind更改的数据不会更新吗?

时间:2011-01-07 19:55:59

标签: php cakephp

如果我使用model的{​​{1}}函数根据其GEO位置调整数据,请执行以下操作:

afterFind

如果在某个区域内,这将使模型返回的数据的价格字段高出20%。

问题是:

让我们说价格是100.管理员在GEO区域并去编辑产品 #app/models/product.php function afterFind($results) { if( $userInArea) { if(!isset($results[0]['Product']['price'])) { return $results; } foreach ($results as $key => $val) { $results[$key]['Product']['price'] = $this->priceAdjustAfterFind($val['Product']['price']); } return $results; } } function priceAdjustAfterFind($price) { return $price * 1.2; } 。从admin/product/edit/4提供给edit view的数据将使价格增加到120,因为她在GEO区域并将触发价格调整。

所以一旦她保存(说她调整了名字),她就会无意中将价格从100改为120.现在,如果她再次编辑它,它将加载为144,每次都会增加。

我没有想出一个合乎逻辑的方法来防止这种情况发生。有什么建议吗?

2 个答案:

答案 0 :(得分:2)

您的代码需要重构,价格字段的条件更新不是一个好主意。

$results[$key]['Product']['price_adjusted'] 
     = $this->priceAdjustAfterFind($val['Product']['price']);

制作视图助手

<?php
class PricingHelper extends AppHelper {
    function show($result) {
          return ($result['price_adjusted']) ? $result['price_adjusted'] : $result['price']
    }
}

在您的视图中调用

<?php echo $this->Pricing->show($result);  ?>

答案 1 :(得分:1)

一种常见的方法是将标记价格作为单独的字段存储在数据库中。这样可以避免编辑时遇到的问题,因为用户始终会编辑基本价格。这也允许在save()而不是每find()上计算标记价格。这比您当前的方法更容易控制,这可以在多模型查找中看到。

这种方法的缺点是它不像find()方法那样动态。这意味着如果您的GEO标记发生变化,您必须重新保存每个产品以便更新价格。

最后,也许某种混合动力最适合你。无论哪种方式,您都可以在模型中使用虚拟字段标记价格,或者在运行时设置。这样您就不会覆盖price,仍然可以使用它。

$results[$key]['Product']['markup_price'] = $this->priceAdjustAfterFind($val['Product']['price']);