Contenible no filtrará segundo modelo de nivel con HABTM y hasMany
-
29-09-2019 - |
Pregunta
Lo que tengo:
"A" HABTM "C" HABTM "A" through join table "B"
"A" hasMany "B" belongsTo "A"
"C" is ordered by a "B" field
Lo que quiero:
// result:
[0] => array(
A => array( /* single model's fields I still need*/ ),
C => array(
[0] => array( C.field1, C.field2, ... /* Model C fields*/ ),
[1] => array( C.field1, C.field2, ... )
)
)
Lo que he intentado:
// this gives me data I don't need:
A->find('all', array( 'conditions' => array( 'id' => $id ) ) )
// result:
[0] => array(
A => array( /* single model's fields I need*/ ),
B => array( /* I DON'T NEED */
[0] => array( ... )
[1] => array( /* ... etc, tons records I don't need */ )
),
C => array(
[0] => array( C.field1, C.field2, ... /* I need these fields*/
[B] => array( /* I DON'T NEED */ )
),
[1] => array( C.field1, C.field2, ... )
[B] => array( /* ... etc, each has a model B I don't need ... */)
)
)
)
El uso de Containable, que puede reducir la consulta un poco, pero no hay modelo, hay cosas que todavía asociada:
// this is a little better
A->find('all', array(
'conditions' => array( 'id' => $id ),
'contain' => array( 'C' )
))
// result:
[0] => array(
A => array( /* single model's fields I still need*/ ),
C => array(
[0] => array( C.field1, C.field2, ... /* I still need Model C fields*/
[B] => array( /* I still DON'T need this Model's fields */ )
),
[1] => array( C.field1, C.field2, ...
[B] => array( /* ... still has unneeded model B */)
)
)
)
NB1 : He leído esta , este , y esta del libro, así como este y este .
NB2 : También he intentado
C->recursive = -1 // no effect
C->unbindModel(array('hasAndBelongsToMany'=>A)) // no effect
A->find('all', array( // not what I want, but it's still
'conditions' => array('id' => $id), // odd that this doesn't filter C's
'contain' => array('A.B'))); // fields out. same as second result
A->find('all', array( // also not what I want, but it's
'conditions' => array('id' => $id), // weird that this doesn't filter B's
'contain' => array('A.B.field'))); // fields at all;
Solución
El ContainableBehavior va campos que se requieren para mapear resultados volverá automáticamente.
página que ya lee:
$this->Post->find('all', array('contain' => 'Comment.author'));
... // data returned:
[Comment] => Array
(
[0] => Array
(
[author] => Daniel
[post_id] => 1
)
...
Como se puede ver, las matrices de comentario sólo contienen el campo de autor (además la post_id que se necesita por CakePHP para mapear los resultados).
En el caso de las relaciones HABTM, la unión se devuelve modelo con las claves externas asociadas, ya que los campos a_id
y c_id
son requeridos por Containable. Mi sugerencia es que simplemente lo ignoran y tomar los valores que necesita. Si lo desea, probablemente podría echar un vistazo a se une porque Containable veces consulta la base de datos muchas, muchas veces. Sin embargo, los datos de modelos asociados no serán devueltos tan bien como Containable.