Foros del Web » Programando para Internet » PHP »

Cakephp CAKE - tabla de relacion user - user

Estas en el tema de CAKE - tabla de relacion user - user en el foro de PHP en Foros del Web. Estoy empezando un proyecto con cake. Quiero relacionar una tabla con si misma. Se trata de el tipico seguimiento de usuario a usuario (como en ...
  #1 (permalink)  
Antiguo 25/09/2010, 16:51
Avatar de mayid
Colaborador
 
Fecha de Ingreso: marzo-2009
Ubicación: BsAs
Mensajes: 4.014
Antigüedad: 15 años, 1 mes
Puntos: 101
CAKE - tabla de relacion user - user

Estoy empezando un proyecto con cake. Quiero relacionar una tabla con si misma. Se trata de el tipico seguimiento de usuario a usuario (como en twitter).

Se que una tabla de relacion tiene sus convenciones en Cake. Por ejemplo, la relación users & words sería:

id, user_id, word_id

Pero cómo sería una relación entre user y user?
  #2 (permalink)  
Antiguo 27/09/2010, 10:43
Avatar de foreverOdd  
Fecha de Ingreso: noviembre-2007
Ubicación: Caracas
Mensajes: 489
Antigüedad: 16 años, 5 meses
Puntos: 14
Respuesta: CAKE - tabla de relacion user - user

estos casos se conocen como self join, he aqui un ejemplo en el bakery

http://bakery.cakephp.org/articles/v...ke-application
__________________
My path is lit by my own fire, I only go where I desire
  #3 (permalink)  
Antiguo 04/10/2010, 07:38
Avatar de mayid
Colaborador
 
Fecha de Ingreso: marzo-2009
Ubicación: BsAs
Mensajes: 4.014
Antigüedad: 15 años, 1 mes
Puntos: 101
Respuesta: CAKE - tabla de relacion user - user

Ok. Gracias. Entonces, se trata de crear un campo parent_id, y luego de trazar las relaciones $belongsTo y $hasMany sobre si mismo, basicamente.

nota: el tutorial no se ve entero en Opera. Hay que leerlo en otro navegador.
  #4 (permalink)  
Antiguo 04/10/2010, 11:35
Avatar de mayid
Colaborador
 
Fecha de Ingreso: marzo-2009
Ubicación: BsAs
Mensajes: 4.014
Antigüedad: 15 años, 1 mes
Puntos: 101
Respuesta: CAKE - tabla de relacion user - user

Sigo buscando. El ejemplo del link anterior se refiere a JOINs, pero no es mi caso. Yo tengo una tabla ( o necesito una tabla, mejor dicho ) de relación users - users. Es decir, no la estoy creando "al vuelo" con Joins.

En Cake se necesita una convención para las tablas de relacion. Para una tabla de relación users-words tengo esto y funciona ok:

users_words
(id, user_id, word_id)

Pero siguiendo la convención, esta tabla es imposible:
users_users
(id, user_id, user_id)

En fin, la voy a hacer asi. Lo que no se es a qué metodos magicos estoy renunciando al romper con las convenciones:
(id, user_id, self_id)

(de cualquier manera, sigo buscando y leyendo sobre self referencing HABTM )

  #5 (permalink)  
Antiguo 04/10/2010, 18:08
Avatar de mayid
Colaborador
 
Fecha de Ingreso: marzo-2009
Ubicación: BsAs
Mensajes: 4.014
Antigüedad: 15 años, 1 mes
Puntos: 101
Respuesta: CAKE - tabla de relacion user - user

La solución que entontrè por el momento es esta:

Código PHP:
Ver original
  1. class UsersUser extends AppModel
  2.     {
  3.          //var $belongsTo = array('User');
  4.                
  5.             var $hasAndBelongsToMany = array(
  6.                  'Friend' => array (
  7.                         'className' => 'User',
  8.                         'joinTable' => 'users_users', // solo para nombres no convencinoales
  9.                         'foreignKey' => 'user_id',
  10.                         'associationForeignKey' => 'friend_id'
  11.                         //unique'                 => true
  12.                     ),
  13.  
  14.                 'Follower' => array('className' => 'User',
  15.                         'joinTable' => 'friends',
  16.                         'foreignKey' => 'friend_id',
  17.                         'associationForeignKey' => 'user_id'
  18.                     )
  19.                  );
  20.  
  21.     }

Última edición por mayid; 05/10/2010 a las 06:08
  #6 (permalink)  
Antiguo 08/10/2010, 10:19
Avatar de mayid
Colaborador
 
Fecha de Ingreso: marzo-2009
Ubicación: BsAs
Mensajes: 4.014
Antigüedad: 15 años, 1 mes
Puntos: 101
Respuesta: CAKE - tabla de relacion user - user

Bueno, sigo con esto. Lo que publique la ultima vez esta casi bien, salvo por esta linea (y porque ahora uso un controlador User y no uno UsersUser):
'joinTable' => 'friends',

que debería decir:
'joinTable' => 'users_users',

En fin, hoy estoy haciendo una accion follow() y no estoy pudiendo guardar bien los datos.

Se trata del tipico sistema de seguir a otro usuario. Para esto uso un link, no un boton, por lo tanto obtengo el dato del usuario por la url.

Lo que necesito es contruir la data para guardar en el formulario, y yo la planteé así:

Código PHP:
Ver original
  1. $user_id = $this->Session->read('Auth.User.id');
  2. $friend_id = $this->params['pass'][0];
  3.                
  4. $data = array('Friend'=>array('user_id'=>$user_id, 'friend_id'=>$friend_id));

Aparentemente esta bien, segun lo que se dice aqui: http://book.cakephp.org/es/view/1031/Saving-Your-Data

Pero a la hora de grabar los datos, veo desde PHPMyAdmin que se me graba cualquier cosa:

id user_id friend_id
1 8 8
2 0 8
3 0 10

Voy probando con distintas ideas, pero no tengo certeza de como grabar datos en esta tabla de relacion (que no requiere agregar nada en las demas tablas, dicho sea de paso).

Última edición por mayid; 08/10/2010 a las 10:49
  #7 (permalink)  
Antiguo 08/10/2010, 10:54
Avatar de mayid
Colaborador
 
Fecha de Ingreso: marzo-2009
Ubicación: BsAs
Mensajes: 4.014
Antigüedad: 15 años, 1 mes
Puntos: 101
Respuesta: CAKE - tabla de relacion user - user

Paso en limpio el problema.

Estoy generando este array:
Cita:
Array
(
[Friend] => Array
(
[user_id] => 8
[friend_id] => 7
)

)
Y guardando. La accion users/follow() es así:
Código PHP:
Ver original
  1. function follow(){
  2.            
  3. if (!empty($this->params['pass'][0]))
  4. {
  5.            
  6. $user_id = $this->Session->read('Auth.User.id'); // 8
  7. $friend_id = $this->params['pass'][0];        // 7
  8.                
  9. $data = array('Friend'=>array('user_id'=>$user_id, 'friend_id'=>$friend_id));              
  10.                
  11. $this->User->save($data)                           
  12.    
  13. }
  14. }

Y lo que me graba es esto:

Código MySQL:
Ver original
  1. id    user_id   friend_id
  2. 1   7   8
  3. 2   7   7

Es decir, me graba dos lineas. La primera invierte el orden, porque debería ser 8 7. La segunda, creo que es consecuencia del modelo. Que dice así:

Código PHP:
Ver original
  1. class User extends AppModel
  2.     {
  3.            var $name = 'User';
  4.            
  5.             var $hasAndBelongsToMany = array(
  6.                 'Friend' => array (
  7.                         'className' => 'User',
  8.                         'joinTable' => 'users_users', // solo para nombres no convencionales
  9.                         'foreignKey' => 'user_id',
  10.                         'associationForeignKey' => 'friend_id'
  11.                         //unique'         => true
  12.                     ),
  13.                 'Follower' => array(
  14.                         'className' => 'User',
  15.                         'joinTable' => 'users_users',
  16.                         'foreignKey' => 'friend_id',
  17.                         'associationForeignKey' => 'user_id'
  18.                     ),              
  19.                 'Word' => array(
  20.                         'className' => 'Word', //Users
  21.                         'joinTable' => 'users_words',
  22.                         'foreignKey' => 'user_id',
  23.                         'associationForeignKey' => 'word_id'
  24.                     )
  25.                  
  26.                  );
  27. }
  #8 (permalink)  
Antiguo 09/10/2010, 10:43
Avatar de mayid
Colaborador
 
Fecha de Ingreso: marzo-2009
Ubicación: BsAs
Mensajes: 4.014
Antigüedad: 15 años, 1 mes
Puntos: 101
Respuesta: CAKE - tabla de relacion user - user

Segun lo que leí sobre las tablas HABTM, y también por casos que se comentan en la web, es mejor hacer la relación de esta manera:

hasMany belongTo hasMany

http://www.nuorderwebs.co.uk/blog/co...t-using-habtm/

Así lo estoy haciendo ahora. Y funciona bien.

Etiquetas: cake, relacion, tablas, usuarios
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 14:12.