Вывод Из Бд По Критериям

Добрый день! Подскажите такую вещь

Есть следующие таблицы:

school (id, name)

schoolsstudents (id, school_id, student_id)

student (id, name, specialnost_id)

specialnost(id, name)

division (id, school_id, name)

ticket (id, room, student_id, division_id)

time (id, date, time_from, time_to, ticket_id)

Нужно вывести такую табличку в school/view/id

Специальность | Студент | Аудитория | Дата(24.02.2012) | Дата(25.02.2012) | Дата(26.02.2012)

Программист | Иванов | 402 | 10:00 - 19:00 | 11:00 - 20:00 | 09:00 - 18:00

Со специальностями и кабинетами разобрался.


$schoolsstudents= Schoolsstudents::model()->findAllByAttributes(array('school_id'=>$model->id));

foreach($schoolsstudents as $_m) {

    $student = Student::model()->findByAttributes(array('id' => $_m->student_id));

    echo $student->name;

}

Нужно следующее: выводить time_from, time_to для тех дат, которые равны полю date в таблице time. И время это выводить для того ticket_id, которое равно ticket(id).

Делаю таким образом:


foreach($lpusstudents as $_m) {            

        $student = Student::model()->findByAttributes(array('id' => $_m->student_id));        

        $specialnost = Specialnost::model()->findByAttributes(array('id' => $student->specialnost_id));

        $ticket = Ticket::model()->findByAttributes(array('student_id' => $_m->student_id));

        $time = Time::model()->findByAttributes(array('ticket_id' => $ticket->id));     


echo $student->name;

echo $specialnost->name;

echo $ticket->room;

$time->time_from;

$time->time_to;

Выводит ошибку Trying to get property of non-object для echo $time->time_from;




SELECT * FROM schoolstudents t1

LEFT JOIN student t2 ON t1.student_id=t2.id

LEFT JOIN ticket t3 ON t1.student_id=t3

LEFT JOIN time t4 ON t3.id=t4.ticket_id



Вот приблизительно такой запрос вытянет все что вам нужно. Можно добавить его в CSqlDataProvider и выводить.

Если не хотите заморачиваться, прочитайте что такое relations и с чем их едят.

http://www.yiiframework.com/doc/guide/1.1/ru/database.arr

Тогда например создание DP для грида будет приблизительно таким:




$dataProvider=new CActiveDataProvider('Schoolsstudents', array(

		    'criteria'=>array(

			'with'=>array(

		    	'student',

			'specialnost',

                        'time',

                        'ticket'  

				),

			'together'=>true,	

		    ),

		));



P.S. Такое количество join-ов до добра не доведет.

Relations прописаны в моделях

БД 5214

DB.jpeg

Опять тоже расписание.

Сейчас в бд есть такие данные:




lpu (1, ЛПУ)

specialuty:

1, Терапевт

2, Ортопед


doctors:

1, Иванов, 1

2, Петров, 1

3, Иванов, 2


lpusdoctors:

1, 1, 1

2, 1, 2


divisions:

1, 1, 001, name1, address1

2, 1, 002, name2, address2


ticket:

1, 25, 25, 1, 1

2, 36, 36, 2, 1

3, 17, 17, 3, 1


time:

1, 2012-05-05, 09:00, 11:00, 1

2, 2012-05-05, 12:00, 14:00, 3

3, 2012-05-06, 09:00, 11:00, 3

4, 2012-05-05, 15:00, 18:00, 1

Следующий код LpuController:




public function actionView($id)

    {

        $model=$this->loadModel1($id);        

        $lpusdoctors= Lpusdoctors::model()->findAllByAttributes(array('lpu_id'=>$model->id));

$this->render('view',array(

            'model'=>$model, 'lpusdoctors'=>$lpusdoctors, 

        ));

 

И вьюхи lpu/view




<table border="1">

        <tr>                    

        <td class="shapka">Специальность</td>

        <td class="shapka">ФИО</td>

            <td class="shapka">Кабинет</td>

        <td class="shapka"><?php echo $monday = date ("d.m.Y", time() - (      date("N")-1) * 24*60*60); ?></td>

        <td class="shapka"><?php echo $tuesday = date ("d.m.Y", time() - ( -1 + date("N")-1) * 24*60*60); ?></td>

        <td class="shapka"><?php echo $wednesday =  date ("d.m.Y", time() - ( -2 + date("N")-1) * 24*60*60); ?></td>

        <td class="shapka"><?php echo $thursday = date ("d.m.Y", time() - ( -3 + date("N")-1) * 24*60*60); ?></td>

        <td class="shapka"><?php echo $friday = date ("d.m.Y", time() - ( -4 + date("N")-1) * 24*60*60); ?></td>

        <td class="shapka"><?php echo $saturday = date ("d.m.Y", time() - ( -5 + date("N")-1) * 24*60*60); ?></td>

        <td class="shapka"><?php echo $sunday = date ("d.m.Y", time() - ( -6 + date("N")-1) * 24*60*60); ?></td>

            </td>

        </tr>        

            <?php 

        

        foreach($lpusdoctors as $_m) {            

        $doctor = Doctor::model()->findByAttributes(array('id' => $_m->doctor_id));        

        $speciality = Speciality::model()->findByAttributes(array('id' => $doctor->speciality_id));

        $ticket = Ticket::model()->findByAttributes(array('doctor_id' => $_m->doctor_id));

        $time = Time::model()->findAllByAttributes(array('ticket_id' => $ticket->id));                

            ?>

        <tr>            

        <td class="room">

            <?php echo $speciality->speciality;

                    echo"<br/>";

            echo $ticket->district; 

                    ?>

        </td>

        <td class="speciality">

                    <?php echo $doctor->first_name . " " .$doctor->last_name." ". $doctor->middle_name;

                    echo"<br/>";             

            ?>

                </td>

        <td>        

            <?php echo $ticket->room;

            echo"<br/>";    

            ?>

            </td>

        <?php foreach($time as $t) {?>

        <td>

            <?php

             echo $t->time_from;

            echo" - ";

            echo $t->time_to;

            echo "&nbsp;&nbsp;";}

            ?>

        </td>  

        </tr>  <?php }?>  

    </table>



На экран выводит 5213

snim.png

Подскажите, что я не так делаю? Нужно, что время четко по датам выдавалось

Это чтобы в 10.02.2014 было 09-11 и 15-18 вместе, и в каждой последующей ячейке с датой тоже самое

Вроде сделал :slight_smile: