Yii Framework Forum: Consulta SQL contra varios Modelos - Yii Framework Forum

Jump to content

Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

Consulta SQL contra varios Modelos Rate Topic: -----

#1 User is offline   JoseYii 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 9
  • Joined: 23-May 12

Posted 03 September 2012 - 02:41 AM

Buenos días.

Tengo una consulta SQL de selección que me devuelve varios registros de varias tablas de mi base de datos.
Funciona perfecto ejecutándola desde 'phpMyAdmyn'.

La consulta es esta:

-- ¿Que horarios tienen asignados los alumnos?

SELECT 
    u.id AS IDusuario,
    u.nombre AS NombreUsuario,
    u.identificacion_cliente AS Empresa,
    -- u.tipo_identificacion_id,   -- 1=NIF, 2=CIF, 3=NIE, 4=OTRO.
    u.identificacion_usuario,
    -- u.tipo_usuario_id,  -- 1=cliente, 2=operador, 3=alumno, 4=profesor. EN ESTE CASO SIEMPRE SERAN ALUMNOS.
    h.id AS IDhorario,
    c.nombre AS nombreCurso,
    a.nombre AS nombreActividad,
    ds.nombre AS diaSemana,
    CONCAT (fh.hora_inicio,' - ',fh.hora_fin) AS FranjaHoraria,
    au.nombre AS nombreAula
    FROM
        usuarios u
        LEFT JOIN alumnos_horarios ah ON u.id = ah.usuarios_id   -- este JOIN une la tabla 'u' (ON u.xxx=) con la tabla 'ah'(=ah.xxx)
        LEFT JOIN horarios h ON ah.horarios_id = h.id   -- este JOIN une la tabla 'ah'(ON ah.xxx=) con la tabla 'h'(=h.xxx)
        LEFT JOIN dia_semana ds ON h.dia_semana_id = ds.dia_semana   -- este JOIN une la tabla 'h'(ON h.xxx=) con la tabla 'ds'(=ds.xxx)
        LEFT JOIN cursos c ON h.cursos_id = c.id   -- este JOIN une la tabla 'h'(ON h.xxx=) con la tabla 'c'(=c.xxx)
        LEFT JOIN actividades a ON h.actividades_id = a.id   -- este JOIN une la tabla 'h'(ON h.xxx=) con la tabla 'c'(=c.xxx)
        LEFT JOIN franjas_horarias fh ON h.franjas_horarias_id = fh.id   -- este JOIN une la tabla 'h'(ON h.xxx=) con la tabla 'fh'(=fh.xxx)
        LEFT JOIN aulas au ON h.aulas_id = au.id   -- este JOIN une la tabla 'h'(ON h.xxx=) con la tabla 'au'(=fh.xxx)
        
        
        -- Empleo 'LEFT JOIN' para que salgan incluso los alumnos que no tienen horario asignado.
        -- Osea todos los registros de la tabla que este a la izquierda de LEFT JOIN xxx. En este caso tabla principal 'usuarios'.
    WHERE 
        u.tipo_usuario_id=3 -- para que salgan sólo los alumnos.
    ORDER BY
        u.id ASC,
        u.identificacion_cliente ASC    -- Para que se ordenen por empresa
;



Pero no consigo traspasarla a Yii.

En mi proyecto tengo creados los modelos, vistas y controladores respectivos. Creados con gii de las tablas con sus relaciones bien hechas. Osea, los modelos tienen correctamente generadas sus 'relations'.

Les agradecería me indiquen cómo hacer esta consulta en Yii.
Muchas gracias.

Si doy con la solución, lo publicaré aqui.
Gracias.
0

#2 User is offline   rgmf 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 18
  • Joined: 12-August 12

Posted 04 September 2012 - 05:31 AM

Hola,

es una consulta bastante grande. Yo te voy a poner un ejemplo de consulta como la tuya pero con menos tablas relacionadas, a ver si de ahí eres capaz de sacarla.

Aquí hay tres tablas: Resource, UserResource y TagResource. Y el objetivo de la consulta es obtener los recursos del usuario (userId) o cuya privacidad sea 0, y cuya etiqueta sea tagId.

$dataProvider=new CActiveDataProvider('Resource',
     array(
          'criteria'=>array(

          'join'=>'join UserResource ur on (t.id=ur.res and (t.privacy=0 or ur.user=:userId))
                   join TagResource tr on (t.id=tr.res and tr.tag=:tagId)',

          'params'=array(':userId'=>Yii::app()->user->id,':tagId'=>$id),
     ),
));


Espero que te sirva de inspiración y puedas sacar tu consulta en Yii.
0

#3 User is offline   desarrollador 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 12
  • Joined: 01-November 11

Posted 12 September 2012 - 11:23 AM

si tienes las relaciones en el modelo puedes crear un objeto criteria
y con la funcion with=array(nombre_relacion1=>array(with=>relacion),nombre_relacion2);
0

#4 User is offline   JoseYii 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 9
  • Joined: 23-May 12

Posted 17 September 2012 - 04:17 AM

View Postdesarrollador, on 12 September 2012 - 11:23 AM, said:

si tienes las relaciones en el modelo puedes crear un objeto criteria
y con la funcion with=array(nombre_relacion1=>array(with=>relacion),nombre_relacion2);


Seguiré investigando.
Muchas gracias por todo.
0

#5 User is offline   Carlos Belisario 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 15
  • Joined: 25-June 12
  • Location:Venezuela

Posted 18 September 2012 - 06:23 PM

Lo primero deberías de mostrarnos que tienes hecho, para poder ver como estas atacando el punto y desde que modelo estas realizando la consulta, de todas maneras verifica si esto te puede dar un poco de luz,

acá otro código para darte un poco de luz
$criteria = new CDbCriteria();
$criteria->select = 'tid, COUNT(posts.tid) as length, subject, views, dateline, username';			
$criteria->order = 'length DESC';	
$criteria->with = array(
    'posts'=>array(      			        			
        'joinType'=>'LEFT JOIN',  
        'order' => 'pid',      			
    ),
);
$criteria->together = true;			
$criteria->group = 'posts.tid';
$criteria->limit = $length;
$dataProvider = new CActiveDataProvider($this, array(
    'criteria' => $criteria,                                                    
));
return $dataProvider;


el join es muy simple, pero de ahí de la simplesa se puede ver como crear joins complejos, pero revisa un poco el link que te deje y ve que tanto te puede servir, espero te ayude, saludos
0

Share this topic:


Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

1 User(s) are reading this topic
0 members, 1 guests, 0 anonymous users