Hace un tiempo vengo penando con las consultas en CAKE, a la hora de relacionar tablas.
Las tablas que tengo son:
users
words
users_words
friends ( o users_users)
Lo que necesito es una consulta que me devuelva:
- los datos del usuario
- sus palabras asociadas
- sus amigos
- las palabras de sus amigos, en lo posible.
Intente con find y recursividad 2. Pero no puedo obtener las palabras de los amigos por un lado. Y por el otro, la profundida de words es exagerada (me devuelve tambien users_words recursivamente).
Luego intenté con Containable y 'fields' para restringir la busqueda (sin recursividad). Pero el resultado era casi el mismo! Demasiada recursividad en words, y un array vacio en friends-> words.
Ahora estoy intentando con joins. Pero obtengo los mismos resultados recursivos, etc. (es cierto que no llegue a declarar fields especificos).
Esta es la consulta con JOINS:
Código PHP:
Ver original$options['conditions'] = array( 'User.id' => $id
);
$options['joins'] = array( 'table' => 'friends',
'alias' => 'users_users',
'type' => 'INNER',
'User.id = users_users.user_id'
)
),
'table' => 'users',
'alias' => 'Friend',
'type' => 'INNER',
'users_users.user_id = Friend.id'
)
),
'table' => 'users_words',
'alias' => 'UsersWords',
'type' => 'INNER',
'User.id = UsersWords.user_id'
)
),
'table' => 'words',
'alias' => 'Word',
'type' => 'LEFT',
'UsersWords.word_id = Word.id'
),
'Word.id',
'GROUP_CONCAT(Word.id ORDER BY Word.id) as id',
'Word.description'
)
)
);
//$options['group'] = array('users.id');
$user_relations = $this->User->find('first', $options);
Lo de GROUP_CONCAT puede no ir. Es solo que pensé que me las ingeniaría para obtener un listado de usuarios separados por comas, y lo mismo con las palabras. Pero ahora que lo pienso, necesito tanto el id como el nombre de ambas tablas.
En fin, el array que suelo obtener con las consultas en mas o menos este:
Código PHP:
Ver original(
(
[id] => 1
[username] => admin
[password] => e714044c058d932bac9a63f7f00273dbce722794
[email] => gperez@agendajoven.org.ar
[photo] => anonimo.gif
)
(
(
[id] => 4
[user_id] => 1
[friend_id] => 2
)
(
[id] => 6
[user_id] => 1
[friend_id] => 3
)
)
(
(
[id] => 6
[name] => corredor
[description] =>
(
[id] => 6
[user_id] => 1
[word_id] => 6
[points] => 1
[description] =>
)
)
(
[id] => 11
[name] => cacharro
[description] =>
(
[id] => 11
[user_id] => 1
[word_id] => 11
[points] => 1
[description] =>
)
)
(
[id] => 12
[name] => esteban
[description] =>
(
[id] => 12
[user_id] => 1
[word_id] => 12
[points] => 1
[description] =>
)
)
)
)
Pero el que quisiera obtener sería mas o menos así:
Código PHP:
Ver original(
(
[id] => 1
[username] => admin
[password] => e714044c058d932bac9a63f7f00273dbce722794
[email] => gperez@agendajoven.org.ar
[photo] => anonimo.gif
)
(
(
[id] => 4
[friend_id] => 2
(
(
[id] => 6
[name] => corredor
[description] =>
)
)
(
[id] => 6
[friend_id] => 3
(
(
[id] => 6
[name] => corredor
[description] =>
)
)
)
(
(
[id] => 6
[name] => corredor
[description] =>
)
(
[id] => 11
[name] => cacharro
[description] =>
)
(
[id] => 12
[name] => esteban
[description] =>
)
)
)
Agradezco que me den una pista de como seguir.