Фон: CakePHP 2.6.3. Довольно стабильное приложение. Новое поведение (MyCustomBehavior
), созданное для вывода дополнительной информации.
У меня есть модель MyModel
, действующая как Containable
(определено в AppModel
), а затем MyCustom
(определено в MyModel
). MyCustomBehavior
написано так, что для работы с ассоциациями модели с другими моделями в моем приложении.
Проблема: Всякий раз, когда я включаю связанные модели в свой вызов find()
MyModel
, я не могу получить полный список MyModel
ассоциаций, потому что поведение Containable
отменяет привязку моделей, которые не содержатся. , Однако, если я не установлю contain
в моих find()
опциях или не установлю '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')
));
Результат MyModel->belongsTo
in MyCustomBehavior::beforeFind()
$belongsTo = array(
'Approver' => array(
...
),
'Status' => array(
...
),
);
Ожидается MyModel->belongsTo
в MyCustomBehavior::beforeFind()
$belongsTo = array(
'MyAnotherModel' => array(
...
),
'Creator' => array(
...
),
'Approver' => array(
...
),
'Status' => array(
...
),
);
Очевидное решение: Один тупой способ решить проблему - просто установить Containable
поведение в MyModel
вместо AppModel
для управления порядком загрузки поведений, то есть public $actsAs = ['MyCustom', 'Containable']
, Это решение не является лучшим, потому что в других моделях могут быть другие поведения, которые зависят от Containable
, поэтому порядок Containable
должен быть явно установлен в каждой модели в приложении и надеяться, что я где-то не сломал приложение.
Подобный (связанный) вопрос был задан на SO здесь , но не имеет ответов.
Требуется более надежное решение, которое может удовлетворить потребности MyCustomBehavior
без необходимости вносить изменения в остальную часть приложения и следить за непредвиденным поведением.