如何在胖模型中保持代码DRY的多个条件?

时间:2011-11-14 19:05:08

标签: cakephp cakephp-appmodel

虽然我正在使用CakePHP,但我认为这个问题适用于任何MVC框架。

请考虑以下事项:

  • 模特A

    getAWithConditionOne()
    
  • 模型B

    getBWithConditionsTwo()
    
  • 模型C(A& B之间的连接模型)

    getCWithConditionOne()
    getCWithConditionTwo()
    getCWithConditionOneAndTwo()
    

是否有任何既定的方法来处理这种情况而无需在连接模型中创建三个单独的方法?感觉很像应该在这里应用Decorator模式,但我不知道如何去做。

也许我只是把问题看错了。

2 个答案:

答案 0 :(得分:2)

是的,有不同的方法。 根据我的经验和目前所见,你可以在这里处理行为。

该方向的现有行为的名称是“NamedScope”(在github中找到)以及我现在无法找到的其他行为。

但基本上你可以在模型中设置命名条件

public $scopes = array(
    'public' => array('Model.active'=>1),
    ...
)

然后您可以在查询和find()调用中合并:

array('scope'=>array('Model.public', 'OtherModel.approved', ...)

等。 行为将它们连接成一个条件数组。

答案 1 :(得分:0)

对我而言,这听起来像是战略模式的一个用例。您将拥有getC方法,期望将策略作为参数。每个策略都是一个使用getConditions方法返回特定策略条件的类。