Ver Mensaje Individual
  #2 (permalink)  
Antiguo 10/09/2011, 22:11
opzina
 
Fecha de Ingreso: marzo-2008
Mensajes: 1.020
Antigüedad: 16 años, 9 meses
Puntos: 21
Respuesta: Find en relaciones HABTM

Hola a todos,

Estoy leyendo y aprendiendo Cakephp y estoy teniendo problemas con las relaciones HasAndBelongsToMany.

Tengo los siguientes modelos y relaciones:

Referencia:
<> : Relaciòn HABTM



times <> subjects
times <> comissions
times <> classrooms
times <> days
times <> hours
times belongsTo types

Necesito buscar y/o filtrar para cada Subjects su times...

A demàs cada times esta compuesto por comissions, classrooms, days, hours

Hice lo siguiente que no se si es correcto:

Código PHP:
Ver original
  1. $this->time->bindModel(array(
  2.                     'hasOne' => array(
  3.                         'SubjectsTime',
  4.                         'ComissionsTime',
  5.                         'ClassroomsTime',
  6.                         'DaysTime',
  7.                         'HoursTime'
  8.         )
  9.         ));
  10.        
  11.         $this->time->contain(array(
  12.                     'SubjectsTime',
  13.                     'ComissionsTime',
  14.                     'ClassroomsTime',
  15.                     'DaysTime',
  16.                     'HoursTime',
  17.                     'Subject.name',
  18.                     'Comission.name',
  19.                     'Classroom.name', 'Classroom.description', 'Classroom.address',
  20.                     'Day.days',
  21.                     'Hour.hours',
  22.                     'Spindle.types'
  23.         ));
  24.        
  25.         $horarios = $this->time->find('all', array(
  26.                 'fields' => array('Time.title'),
  27.                 'recursive' => 1,
  28.                 'conditions'=>array('SubjectsTime.subject_id' => 1) // id of subject
  29.         ));
  30.        
  31.            
  32.            
  33.         debug($horarios);

y el debug, me trae lo siguiente:

Código PHP:
Ver original
  1. (
  2.     [0] => Array
  3.         (
  4.             [Time] => Array
  5.                 (
  6.                     [title] => Bioquìmica
  7.                     [id] => 4
  8.                 )
  9.  
  10.             [Spindle] => Array
  11.                 (
  12.                     [types] => Teórico
  13.                     [id] => 1
  14.                 )
  15.  
  16.             [Classroom] => Array
  17.                 (
  18.                     [0] => Array
  19.                         (
  20.                             [name] => Aula 90
  21.                             [description] => Hospital de Clínicas
  22.                             [address] => Córdoba 2500
  23.                             [ClassroomsTime] => Array
  24.                                 (
  25.                                     [id] => 6
  26.                                     [time_id] => 4
  27.                                     [classroom_id] => 1
  28.                                 )
  29.  
  30.                         )
  31.  
  32.                 )
  33.  
  34.             [Comission] => Array
  35.                 (
  36.                     [0] => Array
  37.                         (
  38.                             [name] => Ã&#353;nica
  39.                            [ComissionsTime] => Array
  40.                                 (
  41.                                     [id] => 6
  42.                                     [comission_id] => 11
  43.                                     [time_id] => 4
  44.                                 )
  45.  
  46.                         )
  47.  
  48.                 )
  49.  
  50.             [Day] => Array
  51.                 (
  52.                 )
  53.  
  54.             [Hour] => Array
  55.                 (
  56.                     [0] => Array
  57.                         (
  58.                             [hours] => 18 - 22
  59.                             [HoursTime] => Array
  60.                                 (
  61.                                     [id] => 6
  62.                                     [time_id] => 4
  63.                                     [hour_id] => 3
  64.                                 )
  65.  
  66.                         )
  67.  
  68.                 )
  69.  
  70.             [Subject] => Array
  71.                 (
  72.                     [0] => Array
  73.                         (
  74.                             [name] => BioquÃ*mica de la Nutrición
  75.                             [SubjectsTime] => Array
  76.                                 (
  77.                                     [id] => 13
  78.                                     [subject_id] => 1
  79.                                     [time_id] => 4
  80.                                 )
  81.  
  82.                         )
  83.  
  84.                 )
  85.  
  86.         )
  87.  
  88. )

En la vista:

Código PHP:
Ver original
  1. foreach ($horarios as $key => $horario) {
  2.                                                    
  3.     echo $horario['Time']['title'] . "<br />";
  4.                                                        
  5.     echo $horario['Spindle']['types'] . "<br />";
  6.                                                    
  7.     echo $horario['Subject'][$key]['name'] . "<br />";
  8.                                                        
  9.     echo $horario['Comission'][$key]['name'] . "<br />";
  10.                                                        
  11.     echo $horario['Classroom'][$key]['name'] . "<br />";
  12.                                                        
  13.     echo $horario['Day'][$key]['days'] . "<br />";
  14.                                                        
  15.     echo $horario['Hour'][$key]['hours'] . "<br />";
  16. }

En teorìa me esta llevando lo correcto, sin embargo, otra de las dudas es en las vistas. Dónde dice $key, significa que puede haber más de un registro, cómo hago para llevar todos los registros independientemente de ese $key??
Hay alguna manera de hacer un set() más limpio desde el controlador?

Espero puedan ayudarme a entender esto...
Desde ya gracias.


***************
ACTUALIZO
***************

Hice esta bùsqueda desde el controlador

Código PHP:
Ver original
  1. $horarios = $this->subject->find('first', array(
  2.             'conditions' => array('Subject.id' => 1),
  3.             'contain' => array(
  4.                 'Time' => array(
  5.                     'Classroom', 'Comission', 'Day', 'Hour', 'Spindle'
  6.                     )),
  7.             'fields' => array('Subject.name')
  8. ));
  9.        
  10.        
  11. debug($horarios);

Lo que me trae el debug es lo siguiente:

Código PHP:
Ver original
  1. (
  2.     [Subject] => Array
  3.         (
  4.             [name] => BioquÃ*mica de la Nutrición
  5.             [id] => 1
  6.         )
  7.  
  8.     [Time] => Array
  9.         (
  10.             [0] => Array
  11.                 (
  12.                     [id] => 4
  13.                     [spindle_id] => 1
  14.                     [title] => Bioquìmica
  15.                     [description] => 1
  16.                     [SubjectsTime] => Array
  17.                         (
  18.                             [id] => 19
  19.                             [subject_id] => 1
  20.                             [time_id] => 4
  21.                         )
  22.  
  23.                     [Spindle] => Array
  24.                         (
  25.                             [id] => 1
  26.                             [types] => Teórico
  27.                         )
  28.  
  29.                     [Classroom] => Array
  30.                         (
  31.                             [0] => Array
  32.                                 (
  33.                                     [id] => 1
  34.                                     [name] => Aula 90
  35.                                     [description] => Hospital de Clínicas
  36.                                     [address] => Córdoba 2500
  37.                                     [ClassroomsTime] => Array
  38.                                         (
  39.                                             [id] => 12
  40.                                             [time_id] => 4
  41.                                             [classroom_id] => 1
  42.                                         )
  43.  
  44.                                 )
  45.  
  46.                         )
  47.  
  48.                     [Comission] => Array
  49.                         (
  50.                             [0] => Array
  51.                                 (
  52.                                     [id] => 11
  53.                                     [name] => Ã&#353;nica
  54.                                    [description] => Comisión Ã&#353;nica
  55.                                    [created] => 2011-09-09
  56.                                     [modified] => 2011-09-09
  57.                                     [ComissionsTime] => Array
  58.                                         (
  59.                                             [id] => 13
  60.                                             [comission_id] => 11
  61.                                             [time_id] => 4
  62.                                         )
  63.  
  64.                                 )
  65.  
  66.                         )
  67.  
  68.                     [Day] => Array
  69.                         (
  70.                         )
  71.  
  72.                     [Hour] => Array
  73.                         (
  74.                             [0] => Array
  75.                                 (
  76.                                     [id] => 3
  77.                                     [hours] => 18 - 22
  78.                                     [HoursTime] => Array
  79.                                         (
  80.                                             [id] => 12
  81.                                             [time_id] => 4
  82.                                             [hour_id] => 3
  83.                                         )
  84.  
  85.                                 )
  86.  
  87.                         )
  88.  
  89.                 )
  90.  
  91.         )

Esto creo que es lo más adecuado. Para la materia con id 1 tengo el siguente Time con sus Classrooms, Comissions, Hours, Days.

Ahora bien...Còmo imprimo esto en las vistas? Tengo esta duda ya que son relaciones muy profundas y no se bien como llevarlo a la vista.

Vean esto:



Gracias...
__________________
_

Última edición por opzina; 11/09/2011 a las 13:12