Foros del Web » Programando para Internet » PHP » Frameworks y PHP orientado a objetos »

Cakephp Datos de otro modelo en una vista join?

Estas en el tema de Datos de otro modelo en una vista join? en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Hola, haber si podeis echarme una mano. Este verano he estado practicando con cakephp, mi intencion, despues de conocer un poco el MVC, era crear ...
  #1 (permalink)  
Antiguo 05/09/2011, 10:50
 
Fecha de Ingreso: agosto-2011
Mensajes: 6
Antigüedad: 12 años, 8 meses
Puntos: 1
Datos de otro modelo en una vista join?

Hola, haber si podeis echarme una mano. Este verano he estado practicando con cakephp, mi intencion, despues de conocer un poco el MVC, era crear una aplicación sencilla para ir practicando con este framework, al final me decidí por hacerme una simple aplicación de futbol(XD, ya se que no es nada original.., pero para practicar cake me va bien.
Bueno, pongo mi estructura:
model-->clasificacio
(tengo una tabla con id, club, puntos, partidos...,)
controller-->clasificacios_controller
(metodo que busca todos los registros y los ordena)
view-->index

model-->partido
(tengo una tabla con id_partido, id_club_local, goles_locali,d_club_visitante, goles_visitante
controller-->clasificacios_controller
(metodo index que busca todos los registros)
(metodo add_partido, añade un registro en la tabla partido)
view-->index
formulario, que pide los equipos y los goles de cada uno.


Bueno, mis problemillas son:

En la vista donde pongo el formulario de partido, hay un select, para lograr poder sacar el nombre del equipo, ya que en esta tabla solo aparecen los id, lo que hice fue un poco chapucero pero funciona, ya que cree un array con las id y sus respectivos nombre de equipos, despues hace el insert perfecto. Pensé que era sufucuente para lo que queria hacer ahi.
Bueno, cuando me dispuse ha hacer una vista index del controlador de los partidos, obviamente me devuelve las id de los clubs, que es lo que tiene la tabla del modelo, entonces aqui si que no me sirve hacer nada raro, lo que necesito es relacionar ese id, con el nombre del club que esta en la tabla clasificacio, para poder mostrar en la vista los equipos, no sus id. Como hago para tratar esa clave ajena, y coger esos datos del otro modelo, perdonad mi ignorancia, pero llevo muy poquito con cakephp.
Tengo una duda mas, pero la dejare para otro post, que ya he mareado bastante, bueno, haber si hay un alma caritativa que me pueda hechar una mano. Gracias!
  #2 (permalink)  
Antiguo 07/09/2011, 01:05
 
Fecha de Ingreso: julio-2008
Ubicación: Barcelona
Mensajes: 2.100
Antigüedad: 15 años, 9 meses
Puntos: 165
Respuesta: Datos de otro modelo en una vista join?

Creo que más que el framework, el lio esta en el diseño de la base de datos.

Tendría que mostrar la estructura de las tablas, yo supongo que con una relación en tu consulta sql sería suficiente. Es decir, el id, lo relacionas con la tabla donde tienes el nombre o valor que te falta.

Un saludo!
  #3 (permalink)  
Antiguo 18/09/2011, 17:15
Avatar de Jennydmz  
Fecha de Ingreso: septiembre-2011
Ubicación: La Paz - Bolivia
Mensajes: 4
Antigüedad: 12 años, 7 meses
Puntos: 0
Respuesta: Datos de otro modelo en una vista join?

Hola entiendo q tienes algunas dudas en el manejo de relaciones con CakePhp, ten encuenta que en el modelo de cada una de las tablas tienes que manejar la relacion ya sea hasmeny, belongsto, hasone, o hasmanyandbelonsto.

T dejo un pequeño ejemplo de una aplicacion que cumple basicamente con lo que buscas.

Tenemos dos tablas:

Alumnos
Id
Nombre
Curso_id

Cursos
Id
Nombre

En esta pequeña BD hay dos tablas que se relacionan 1 a n donde un curso puede tener muchos alumnos. (Ojo revisa las convenciones de cakephp, no importa si en tu bd existe esa relación)

Primero debes tener un controlador alumnos_controller.php con el siguiente código:
Código PHP:
Ver original
  1. <?php
  2. class AlumnosController extends AppController {
  3. var $name = 'Alumnos';
  4. var $helpers = array('Form' );
  5. function index() {
  6. $this->Alumno->recursive = 0;
  7. $alumnos = $this->Alumno->find('all');
  8. $this->set('alumnos', $alumnos);
  9. }
  10.  
  11. function add() {
  12. if (!empty($this->data)) {
  13. $this->Alumno->create();
  14. $this->Alumno->save($this->data);
  15. $this->redirect(array('action'=>'index'));
  16. }
  17. $cursos = $this->Alumno->Curso->find('list',array('fields'=>'Curso.nombre'));
  18. $this->set('cursos', $cursos);
  19. }
  20.  
  21. }
  22. ?>

En tu controlador de cursos_controller.php coloca el siguiente código:
Código PHP:
Ver original
  1. <?php
  2. class CursosController extends AppController {
  3. var $name = 'Cursos';
  4. function index() {
  5. $this->Curso->recursive = 1;
  6. $cursos = $this->Curso->find('all');
  7. $this->set('cursos', $cursos);
  8. }
  9.    
  10. function add()
  11.   {
  12.     if(!empty($this->data))
  13.     {
  14.       $this->Curso->create();
  15.       if($this->Curso->save($this->data))
  16.       {
  17.         $this->Session->setFlash('El nuevo curso fue almacenado exitosamnete');
  18.         $this->redirect(array('action'=>'index'),null,true);
  19.       }
  20.       else
  21.       {
  22.         $this->Session->setFlash('No se pudo almacenar los nuevos datos');
  23.       }
  24.     }
  25.   }
  26.  
  27. }
  28. ?>

Para el modelo de alumno.php coloca el siguiente código:
Código PHP:
Ver original
  1. <?php
  2. class Alumno extends AppModel
  3. { var $name = 'Alumno';
  4. var $belongsTo = 'Curso';
  5.  
  6. }
  7. ?>

En curso.php debes colocar lo siguiente:
Código PHP:
Ver original
  1. <?php
  2. class Curso extends AppModel
  3. {
  4. var $name = 'Curso';
  5. var $hasMany = 'Alumno';
  6. }
  7. ?>

Para generar tus vistas debes hacerlo cada una para determinada acción en este caso te recomiendo que agregues una carpeta en: app/views/alumnos con el nombre del mismo controlador.

Haces lo propio en el mismo directorio para cursos.
Una vez creadas ambas carpetas crea los siguientes archivos:
Para alumnos creas un archivo index.ctp dentro la carpeta alumnos con lo siguiente:
Código PHP:
Ver original
  1. <h1>ALUMNOS</h1>
  2. <?php if(empty($alumnos)):?>
  3. NO HAY ALUMNOS REGISTRADOS
  4. <?php else:?>
  5. <table>
  6.   <tr>
  7.   <th>Nombre</th>
  8.   <th>Curso</th>
  9.   </tr>
  10.   <?php foreach ($alumnos as $alumno):?>
  11.   <tr>
  12.     <td>
  13.      <?php echo $alumno['Alumno']['nombre']?>
  14.     </td>
  15.     <td>
  16.      <?php echo $alumno ['Curso']['nombre']?>
  17.     </td>
  18.   </tr>
  19.   <?php endforeach;?>
  20. </table>
  21. <?php endif;?><br />
  22.   <?php echo $html->link('Registrar Nuevo Alumno',array('action'=>'add'));?> <br />

Para alumnos tambien creas un archivo add.ctp con lo siguiente:
Código PHP:
Ver original
  1. <?php echo $form->create('Alumno');?>
  2. <fieldset>
  3. <legend>A&ntilde;adir Nuevo Alumno</legend>
  4. <?php
  5. echo $form->input('nombre');
  6. echo $form->input('curso_id');
  7. ?>
  8. </fieldset>
  9. <?php echo $form->end('Enviar');?>
  10. <?php echo $html->link('Ver todos los Alumnos registrados',array('action'=>'index'));?>

Ahora también creas el archivo index.ctp para cursos dentro de la carpeta usuarios con lo siguiente:
Código PHP:
Ver original
  1. <h1>CURSOS</h1>
  2. <?php if(empty($cursos)):?>
  3. NO HAY CURSOS REGISTRADOS
  4. <?php else:?>
  5. <table>
  6.   <tr>
  7.   <th>Nombre</th>
  8.   </tr>
  9.   <?php foreach ($cursos as $curso):?>
  10.   <tr>
  11.     <td>
  12.      <?php echo $curso['Curso']['nombre']?>
  13.     </td>
  14.   </tr>
  15.   <?php endforeach;?>
  16. </table>
  17. <?php endif;?><br />
  18.   <?php echo $html->link('Registrar Nuevo Curso',array('action'=>'add'));?> <br />
  19.   <?php echo $html->link('Ver la lista de Alumnos',array('controller'=>'Alumnos','action'=>'index'));?><br />

Despues un archivo add.ctp con el siguiente código:
Código PHP:
Ver original
  1. <?php echo $form->create('Curso');?>
  2. <fieldset>
  3.   <legend>Agregar Nuevo Curso</legend>
  4.   <?php
  5.   echo $form->input('nombre');
  6.   ?>
  7. </fieldset>
  8. <?php echo $form->end('Guardar');?>
  9. <?php echo $html->link('Ver todos los Cursos registrados',array('action'=>'index'));?>

Esta pequeña aplicación registra estudiantes en diferentes cursos donde un estudiante pertenece a un curso y un curso tiene muchos estudiantes.

También la probé y funciona perfectamente si tienes alguna duda me preguntas.

Suerte y espero que te sirva, yo tambien estube sufriendo por aprender cake...

Etiquetas: cakephp
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 00:58.