正如您所说,最好的 FMSC 方法是在模型中编写函数。但是!!不要在 AppModel 中这样做,这是不好的做法。为什么要将与两个(最多)模型相关的代码放在 AppModel 中?每个模型都会继承该功能,这没有多大意义。假设您有一个“菜单模型”或“用户模型”,它们继承一个totalExpenses
功能是不合逻辑的,对吧?我了解您希望在每个控制器中都提供该功能并查看是否需要增加,但这不是这样做的方法。
一步一步来(其实就是两步):
1) 在 ExpenseClaim 模型中,编写一个新函数来计算总费用
class ExpenseClaim extends AppModel {
/* definitions and validations here*/
public function totalExpenses($id) {
return $this->Expenses->find('count', array('conditions'=>
array('expense_claim_id' => $id)));
}
}
因此,在 ExpenseClaimsController 中,您可以使用
$total = $this->ExpenseClaims->totalExpenses($the_id);
2) 现在,在费用报销模型中计算总数的功能是合乎逻辑的,因此可以在相应的控制器中使用,但是您说您想在pages/admin_index中使用它,让我们假设pages与索赔模型。那么,你可以做
ClassRegistry::init("ExpenseClaims")->totalExpenses($the_id);
或者
$this->loadModel("ExpenseClaims");
$this->ExpenseClaims->totalExpenses($the_id);
(都在控制器中)并且您将获得该值,而无需将该函数放入 AppModel 中。
(顺便说一句,我写的代码应该可以工作,但是您需要微调控制器和模型名称或在这里和那里关闭括号,我还没有测试过)。
现在,这是一般的最佳实践。适用于大多数情况,具有更复杂的功能。但是对于您的具体情况,您可能想看看 cake 的counterCache,它可以计算东西而无需您做太多事情。