Предыстория: 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
из 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
без внесения изменений в остальную часть приложения и отслеживания любого неожиданного поведения.