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; 
¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top