2012-02-15 115 views
0

我使用cakePHP 2.0 afterFind()回调在数据库值显示之前对其执行计算。cakePHP afterFind和Association Values

我有三种模型 - 材料,产品和报价。

每个产品具有一材料和计算使用该关联在产品一个afterFind回调进行,特别是与线路:

$results[$key]['Product']['material_cost'] = $results[$key]['Product']['material_mass'] * $val['Material']['cost']; 

$val['Material']['cost']与参考相关联的材料。

目前为止还不错。

接下来我在我的报价模型中有一个afterFind()回调。报价与产品相关联,报价模型中的计算取决于产品模型中的计算 - 特别是对材料进行评估的计算。

我可以引用产品型号一个afterFind的报价模型结果一个afterFind就好了,如:$val['Product']['number_tools']

不过,现在的产品型号无法找到相关的材料和我得到的错误: 未定义指数:材质[APP /Model/Product.php,第126行]。
在线Product.php的126

$val['Material']['cost'] 

我怎样才能解决这个问题得到,它的驾驶我疯了!

+0

一般通常总是来计算这些东西“按需”一个好主意 - 前不久实际输出它。主要优点是如果不需要这些计算就不会完成,例如,如果发生重定向或者只有标题等将显示在视图中。 – mark 2012-02-15 13:56:30

+0

无论何时查询数据库,都需要或多或少的计算,以便afterFind回调完全符合我的要求,并在数据发送到视图之前即时执行计算。 - 另外它允许我保留模型中的所有逻辑。 – Ralphonz 2012-02-15 14:19:35

回答

0

您需要加载Material的模型。您可以从产品访问它的原因是因为它与关系相关联,并且您的递归默认允许模型加载相关数据。所以在报价模型beforeFind方法,你就开始通过数据分析之前,加载材料型号:

public function afterFind($results) { 

    App::uses('Material', 'Model'); 
    $material = new Material(); 
    $materials = $material->find(...); 

    foreach ($results as $key => $val) { 
     // access $materials['Material']['cost'] 
    } 
    return $results; 
} 
+0

谢谢你的回答查克。这是有道理的,除了它是Product.php寻找材料模型而不是Quote.php。引用php与产品相关联,因此在调用Find()函数后调用产品模型,但抛出错误。材料模型不能直接从Quote.php访问。我将如何解决这个问题? – Ralphonz 2012-02-16 09:50:14

+0

这可能是一个错误?我注意到,如果我尝试使用上面的或ClassRegistry :: init('Material') - > find()或者甚至$ materials = $ this-> Material-> findById(4)来加载产品模型中的材质模型, ;然后从Quote模型访问它我得到一个致命错误:允许内存大小为134217728字节耗尽(试图分配523800字节)在 – Ralphonz 2012-02-16 10:41:30

+0

作为解决方案我已经将报价与材料相关联,并再次在引用模型,使用isset测试来停止产品模型抛出错误。然而,我现在正在处理另一个问题,这可能是最好的另一个问题 – Ralphonz 2012-02-16 15:14:45