Ver Mensaje Individual
  #3 (permalink)  
Antiguo 18/09/2011, 17:15
Avatar de Jennydmz
Jennydmz
 
Fecha de Ingreso: septiembre-2011
Ubicación: La Paz - Bolivia
Mensajes: 4
Antigüedad: 13 años, 3 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...