Obter associações originais depois de usar o comportamento Contêiner no CakePHP
Fundo: CakePHP 2.6.3. Um aplicativo bastante estável. Novo comportamento (MyCustomBehavior
) criado para gerar algumas informações extras. Eu tenho um modeloMyModel
agindo comoContainable
(definido emAppModel
) e depoisMyCustom
(definido emMyModel
)MyCustomBehavior
foi escrito de uma maneira que ele precisa trabalhar com as associações do modelo com outros modelos no meu aplicativo.
Problema: Sempre que eu tiver modelos relacionados no meufind()
chamada deMyModel
, Não consigo obter uma lista completa deMyModel
associações porqueContainable
comportamento desassocia os modelos que não estão contidos. No entanto, se eu não definircontain
no meufind()
opções ou conjunto'contain' => false
tudo funciona como esperado.
AmostraMyModel->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' => ''
),
);
Amostrafind()
$this->MyModel->find('all', array(
'fields' => array(...),
'conditions' => array(...),
'contain' => array('Approver', 'Status')
));
Resultado deMyModel->belongsTo
noMyCustomBehavior::beforeFind()
$belongsTo = array(
'Approver' => array(
...
),
'Status' => array(
...
),
);
EsperadoMyModel->belongsTo
noMyCustomBehavior::beforeFind()
$belongsTo = array(
'MyAnotherModel' => array(
...
),
'Creator' => array(
...
),
'Approver' => array(
...
),
'Status' => array(
...
),
);
Solução óbvia: Uma maneira idiota de resolver o problema é simplesmente definirContainable
comportamento emMyModel
ao invés deAppModel
para controlar a ordem de carregamento dos comportamentos, ou seja,public $actsAs = ['MyCustom', 'Containable']
. Essa solução não é a melhor porque pode haver outros comportamentos em outros modelos que dependem deContainable
, então a ordem deContainable
precisa definir explicitamente em cada modelo no aplicativo e espero que não o quebrei em algum lugar.
Uma pergunta semelhante (relacionada) foi feita no SOaqui mas não tem respostas.
Precisa de uma solução mais robusta que possa atender às necessidades deMyCustomBehavior
sem precisar fazer alterações no restante do aplicativo e sem olhar para comportamentos inesperados.