Consulta SQL contra varios Modelos

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.

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.

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.

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