Pregunta

Tengo configuradas las siguientes relaciones:

A HABTM B
B belongsTo C
C hasMany B

Ahora, para una A dada, necesito todas las C con las B adjuntas. Puedo escribir las consultas SQL, pero ¿cuál es la forma correcta de CakePHP? ¿A qué método llamo en qué modelo y con qué parámetros?

¿Fue útil?

Solución

Iría con la respuesta de Aziz y simplemente procesaría los datos tal como vienen. Sin embargo, si necesita que C sea su modelo principal, tendrá que hacer una pequeña solución. Cake aún no es terriblemente bueno con las condiciones en modelos relacionados, especialmente en consultas de primos terceros eliminados. Por lo general, solo realiza consultas JOIN reales sobre pertenece a o tiene muchas relaciones; sin embargo, no en las relaciones HABTM, las que recibe en consultas separadas. Eso significa que no puede incluir condiciones en los modelos HABTM relacionados.

Su mejor apuesta podría ser algo como esto:

// get related records as usual with the condition on A, limit to as little data as necessary
$ids = $this->A->find('first', array(
    'conditions' => array('A.id' => 'something'), 
    'recursive'  => 2,
    'fields'     => array('A.id'),
    'contain'    => array('B.id', 'B.c_id', 'B.C.id') // not quite sure if B.C.id works, maybe go with B.C instead
));

// find Cs, using the ids we got before as the condition
$Cs = $this->C->find('all', array(
    'conditions' => array('C.id' => Set::extract('/B/C/id', $ids)),
    'recursive   => 1
);

Tenga en cuenta que esto produce un montón de consultas, por lo que no es realmente una solución óptima. Escribir su propio SQL en realidad podría ser la forma más limpia.

EDITAR:

Alternativamente, podría volver a vincular sus asociaciones sobre la marcha para que tengan relaciones hasMany / belongTo, lo más probable es que use la tabla / modelo de combinación de A y B. Eso podría permitirle usar condiciones en modelos relacionados más fácilmente, pero aún es difícil obtener Cs cuando la condición está en A.

Otros consejos

$this->A->find(
   'first', 
   array('conditions'=>array('id'=>'someword'), 
   'recursive'=>2)
);

¿te gusta esto?

esto podría funcionar

$this->C->find('all',
array('conditions'=>array('id'=>'someword','B.aid'=>$a.id)));

Pensaría en '' Containable '' comportamiento ( http://book.cakephp.org/view/474/Containable ) ... da mucho control sobre la búsqueda de datos relacionados.

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