【发布时间】:2018-08-30 08:17:38
【问题描述】:
背景: CakePHP 2.6.3。一个相当稳定的应用程序。创建新行为 (MyCustomBehavior) 以输出一些额外信息。
我有一个模型MyModel 充当Containable(在AppModel 中定义),然后是MyCustom(在MyModel 中定义)。 MyCustomBehavior 的编写方式需要与模型与我的应用程序中的其他模型的关联一起工作。
问题:每当我在MyModel 的find() 调用中包含相关模型时,我无法获得MyModel 关联的完整列表,因为Containable 行为会取消绑定未绑定的模型包含。但是,如果我没有在我的find() 选项中设置contain 或设置'contain' => false,一切都会按预期工作。
示例MyModel->belongsTo
public $belongsTo = array(
'MyAnotherModel' => array(
'className' => 'MyAnotherModel',
'foreignKey' => 'my_another_model_id',
'conditions' => '',
'fields' => '',
'order' => ''
),
'Creator' => array(
'className' => 'User',
'foreignKey' => 'user_id',
'conditions' => '',
'fields' => '',
'order' => ''
),
'Approver' => array(
'className' => 'User',
'foreignKey' => 'approver_id',
'conditions' => '',
'fields' => '',
'order' => ''
),
'Status' => array(
'className' => 'Status',
'foreignKey' => 'status_id',
'conditions' => '',
'fields' => '',
'order' => ''
),
);
示例find()
$this->MyModel->find('all', array(
'fields' => array(...),
'conditions' => array(...),
'contain' => array('Approver', 'Status')
));
MyCustomBehavior::beforeFind()中MyModel->belongsTo的结果
$belongsTo = array(
'Approver' => array(
...
),
'Status' => array(
...
),
);
MyCustomBehavior::beforeFind() 中的预期为 MyModel->belongsTo
$belongsTo = array(
'MyAnotherModel' => array(
...
),
'Creator' => array(
...
),
'Approver' => array(
...
),
'Status' => array(
...
),
);
明显的解决方案: 解决问题的一种笨方法是简单地在MyModel 中设置Containable 行为而不是AppModel 来控制加载行为的顺序,即@987654349 @。这个解决方案不是最好的,因为其他模型中可能有其他行为依赖Containable,所以Containable的顺序需要在应用程序中的每个模型中明确设置,希望我没有在某个地方破坏应用程序。
在 SO here 上提出了一个类似(相关)的问题,但没有答案。
需要一个更强大的解决方案来满足MyCustomBehavior 的需求,而无需对应用程序的其余部分进行更改并注意任何意外行为。
【问题讨论】:
-
好吧,我认为有人会发布比我更好的答案,或者至少指出我认为完美的解决方案的潜在问题。由于这篇文章没有太多的活动,我将我的解决方案标记为已接受,直到有人可以提供具有充分理由的更好解决方案。如果值得的话,我不介意改变我接受的解决方案。
标签: cakephp cakephp-2.x