Foros del Web » Programando para Internet » PHP »

Cakephp Guardar datos en tabla HABTM en CAKE

Estas en el tema de Guardar datos en tabla HABTM en CAKE en el foro de PHP en Foros del Web. Estoy siguiendo la convencion de nombres de tablas (en CAKE), y queriendo guardar datos de una relacion muchos a mucho (HABTM). Mi esquema es db ...
  #1 (permalink)  
Antiguo 07/10/2010, 19:36
Avatar de mayid
Colaborador
 
Fecha de Ingreso: marzo-2009
Ubicación: BsAs
Mensajes: 4.014
Antigüedad: 15 años, 8 meses
Puntos: 101
Guardar datos en tabla HABTM en CAKE

Estoy siguiendo la convencion de nombres de tablas (en CAKE), y queriendo guardar datos de una relacion muchos a mucho (HABTM).

Mi esquema es db es:

users (id, username)
user_words (id, user_id, word_id)
words (id, word)

Segun lo explicado aqui, to debería ir sobre ruedas:
http://book.cakephp.org/es/view/1034...del-Data-HABTM

Pero no me funciona. Grabando desde word/add solo se llena la tabla word. La tabla de relacion no se llena.

Esta es mi vista:

Código PHP:
Ver original
  1. echo $form->create();
  2.  
  3. //echo $form->hidden('id');
  4. echo $form->input('User.id', array('type'=>'hidden', 'value' => $user_data['User']['id']));
  5. echo $form->input('name', array( 'label' => 'Nueva Palabra para '.$user_data['User']['username'], 'maxLength' => 90));
  6.  
  7. echo $form->end('Agregar');

Esta es mi accion words/add:

Código PHP:
Ver original
  1. function add()
  2.         {
  3.            
  4.             if (!empty($this->data))
  5.             {    
  6.                            
  7.                 $this->Word->create();
  8.                
  9.                 if ($this->Word->save($this->data))
  10.                     $this->redirect('/users/display');
  11.             }
  12.            
  13.             $user_id = $this->params['pass'][0];
  14.             $user_data = $this->Word->User->find('first', array('conditions' => array('User.id' => $user_id)));
  15.            
  16.             $this->set('user_data',$user_data);
  17.            
  18.         }

Y mi modelo:

Código PHP:
Ver original
  1. class Word extends AppModel
  2.     {
  3.        
  4.         var $hasAndBelongsToMany = array(
  5.             'User'=> array(
  6.                 'className' => 'User', //sWord
  7.                 'joinTable' => 'users_words',
  8.                 'foreignKey' => 'word_id',
  9.                 'associationForeignKey' => 'user_id'
  10.             ));
  11. }

Anteriormente use una alternativa: crear un modelo users_word, y un controlador, estableciendo las relaciones hasMany belongTo hasMany, pero me pasaba lo mismo. Podia grabar en la tabla (de relacion) y no me grababa en la tabla (words).

En fin, el problema es que no me funciona grabar en dos tablas a la vez. Intenté setear todo en InnoDB pero tampoco cambia nada.
  #2 (permalink)  
Antiguo 08/10/2010, 08:35
 
Fecha de Ingreso: septiembre-2010
Ubicación: Buenos Aires
Mensajes: 18
Antigüedad: 14 años, 2 meses
Puntos: 2
Respuesta: Guardar datos en tabla HABTM en CAKE

($this->Word->save($this->data))

Tienes que utilizar saveAll() en ves de save()
  #3 (permalink)  
Antiguo 08/10/2010, 08:57
Avatar de mayid
Colaborador
 
Fecha de Ingreso: marzo-2009
Ubicación: BsAs
Mensajes: 4.014
Antigüedad: 15 años, 8 meses
Puntos: 101
Respuesta: Guardar datos en tabla HABTM en CAKE

Ya veo. Gracias! En realidad hoy tambien está funcionando con save(). No se por qué, pero anoche pude grabar algunas tuplas.

Es necesario que las tablas sean InnoDB para este tipo de consultas?

Otra cosa: el manual dice que a la hora de grabar relaciones HABTM se borran las tuplas previas. Se puede evitar eso?

Saludos!
  #4 (permalink)  
Antiguo 08/10/2010, 08:58
Avatar de foreverOdd  
Fecha de Ingreso: noviembre-2007
Ubicación: Caracas
Mensajes: 489
Antigüedad: 17 años
Puntos: 14
Respuesta: Guardar datos en tabla HABTM en CAKE

En esta pagina dicen como guardar, simplemente tienes que armar los arreglos tal cual indican,
Debes tener cuidado con el atributo UNIQUE de la declaración de la relación en los modelos, ya que al guardar borras las relaciones anteriores. utiliza el metodo save y no saveAll, al ver los datos cake sabra lo que estas queriendo decir.

Simplemente debes enviar los datos tal cual indican en la pagina y es pan comido.

http://nuts-and-bolts-of-cakephp.com...2-saving-data/
__________________
My path is lit by my own fire, I only go where I desire

Última edición por foreverOdd; 08/10/2010 a las 08:59 Razón: edito lo de los metodos
  #5 (permalink)  
Antiguo 08/10/2010, 09:54
Avatar de mayid
Colaborador
 
Fecha de Ingreso: marzo-2009
Ubicación: BsAs
Mensajes: 4.014
Antigüedad: 15 años, 8 meses
Puntos: 101
Respuesta: Guardar datos en tabla HABTM en CAKE

Cita:
el manual dice que a la hora de grabar relaciones HABTM se borran las tuplas previas.
Ya entiendo. Lo que pasa a la hora de existir tuplas "repetidas" es que se eliminan y se crean nuevas. Es decir, no se actualizan.

Gracias por el link!

Una duda mas: es necesario usar create() en el controlador antes de save()? $this->User->create();
  #6 (permalink)  
Antiguo 08/10/2010, 10:04
Avatar de foreverOdd  
Fecha de Ingreso: noviembre-2007
Ubicación: Caracas
Mensajes: 489
Antigüedad: 17 años
Puntos: 14
Respuesta: Guardar datos en tabla HABTM en CAKE

NO se eliminan las repetidas, se eliminan TODAS las relaciones existentes y se crean las nuevas.
No es necesario usar create para el habtm.
__________________
My path is lit by my own fire, I only go where I desire
  #7 (permalink)  
Antiguo 08/10/2010, 10:10
Avatar de mayid
Colaborador
 
Fecha de Ingreso: marzo-2009
Ubicación: BsAs
Mensajes: 4.014
Antigüedad: 15 años, 8 meses
Puntos: 101
Respuesta: Guardar datos en tabla HABTM en CAKE

Ah! Perfecto. Ya voy entendiendo. Pero como es mi primer proyecto, hasta que no tome distancia me voy a liar.

Del uso de innoDB que me dices? No es necesario, verdad?
  #8 (permalink)  
Antiguo 08/10/2010, 10:26
Avatar de NUCKLEAR
Moderador radioactivo
 
Fecha de Ingreso: octubre-2005
Ubicación: Cordoba-Argentina
Mensajes: 5.688
Antigüedad: 19 años
Puntos: 890
Respuesta: Guardar datos en tabla HABTM en CAKE

La ventaja que tiene usar innoDb es que puedes crear claver foraneas en tus tablas y trabajar los campos en cascada. No es necesario si todo eso lo haces desde el modelo.

Aca hay un buen articulo, bien explicado http://www.bibigeek.com/2009/08/30/c...key-con-mysql/
__________________
Drupal Argentina

Etiquetas: cake, tablas
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 22:22.