Tengo las siguientes tablas: carpetas, documentos, usuarios, docs_users. Doc pertenece a Binder, Doc tieneAndBelongsToMany usuario.Cómo filtrar asociaciones profundas en CakePHP
Quiero obtener carpetas y sus documentos asociados para el usuario que está actualmente conectado (el user_id asociado en la tabla docs_users).
He intentado con Containable y find ('all') con combinaciones, condiciones, etc. pero no puedo encontrar la manera de eliminar los documentos que provienen de usuarios que no están asociados en la tabla docs_users.
Este código no funciona:
$binders = $this->Binder->find(
'all',
array(
'joins' => array(
array(
'table' => 'binders_users',
'alias' => 'BindersUser',
'type' => 'inner',
'foreignKey' => false,
'conditions'=> array(
'BindersUser.binder_id = Binder.id',
'BindersUser.user_id = ' . $this->Auth->user('id')
)
),
array(
'table' => 'docs',
'alias' => 'Doc',
'type' => 'left',
'foreignKey' => false,
'conditions'=> array(
'Doc.binder_id = Binder.id',
)
),
array(
'table' => 'docs_users',
'alias' => 'DocsUser',
'type' => 'left',
'foreignKey' => false,
'conditions'=> array(
'DocsUser.doc_id = Doc.id',
'DocsUser.user_id = ' . $this->Auth->user('id')
)
)
),
'recursive'=>0
)
);
$this->set('binders', $binders);
Y tampoco esto:
$this->Binder->recursive = 2;
$this->Binder->Behaviors->attach('Containable');
$this->Binder->contain(array(
'Branch',
'Doc' => array(
'User' => array(
'DocsUser' => array(
'conditions' => array('id = "17"')
)
)
)
));
$binders = $this->Binder->find('all');
Cualquier ayuda de profesionales experimentados le sería genial! ¡Gracias!
¿Soluciones alternativas/simplificadas?
Esto funciona si solo quiero obtener carpetas a las que los usuarios tienen permisos. Corto y dulce. Sin embargo, aún enviará TODOS los documentos asociados, lo cual NO es el comportamiento que deseo. Solo debe transmitir los documentos a los que el usuario tiene permisos (como se describió anteriormente).
$binders = $this->Binder->find(
'all',
array(
'joins' => array(
array(
'table' => 'binders_users',
'alias' => 'BindersUser',
'type' => 'inner',
'foreignKey' => false,
'conditions'=> array(
'BindersUser.binder_id = Binder.id',
'BindersUser.user_id = ' . $this->Auth->user('id')
)
)
)
)
);
Podría ayudar si se establece 'debug' a 2 y mira lo que está generando la torta de consulta. Luego realice los cambios necesarios para obtener el resultado deseado. – JohnP
Además, podría pegar su esquema DB en pastebin o algo así y vincularlo. – JohnP
Buena idea. Aquí está: http://pastebin.com/0bRn9USD No estoy usando las tablas de ACL en este momento porque creo que hacerlo en un nivel récord crearía una base de datos masiva. Un poco derrota el propósito. – dbme