Построение SQL-запроса при помощи yii

Обсуждение документации. Переводы Cookbook и авторские рецепты.
Ответить
Reinchold
Сообщения: 48
Зарегистрирован: 2013.01.17, 02:19

Построение SQL-запроса при помощи yii

Сообщение Reinchold »

Привет всем,
хотелось бы использовать Yii - конструктор запроса,
у меня такой запрос, я не вполне представляю, как его можно реализовать:
"SELECT * FROM tutor
JOIN school
JOIN user_school
WHERE school.id = user_school.school_id
AND user_school.user_id = tutor.user_id"
Нахожусь в моделе "Tutor", отсуда и хочу произвести этот запрос.
Reinchold
Сообщения: 48
Зарегистрирован: 2013.01.17, 02:19

Re: Построение SQL-запроса при помощи yii

Сообщение Reinchold »

Я там уже был. Мне бы по моему вопросу какой нибудь пример, там где двойной join в реляции прописывается, как оно вообще выглядит...
Skiller
Сообщения: 627
Зарегистрирован: 2011.11.27, 00:21

Re: Построение SQL-запроса при помощи yii

Сообщение Skiller »

Иногда проще использовать обычный queryBuilder, завернутый в соотв. метод. Либо используйте criteria-chaining, т.к. когда в методе получаете $this->getCriteria()->mergeWith(); и т д. Либо через обычный find.
Аватара пользователя
SiZE
Сообщения: 2817
Зарегистрирован: 2011.09.21, 12:39
Откуда: Perm
Контактная информация:

Re: Построение SQL-запроса при помощи yii

Сообщение SiZE »

Reinchold писал(а):JOIN
Моветон. Пиши INNER JOIN.
Аватара пользователя
SiZE
Сообщения: 2817
Зарегистрирован: 2011.09.21, 12:39
Откуда: Perm
Контактная информация:

Re: Построение SQL-запроса при помощи yii

Сообщение SiZE »

Reinchold писал(а):там где двойной join в реляции прописывается, как оно вообще выглядит...
Показывай что уже пробовал, что не получилось?
Reinchold
Сообщения: 48
Зарегистрирован: 2013.01.17, 02:19

Re: Построение SQL-запроса при помощи yii

Сообщение Reinchold »

Вот, что у меня имеется, конечно не работает как надо...
Мне нужна правильная связь между классами через relations()...
models/Tutor.php

Код: Выделить всё

class Tutor extends CActiveRecord
{
    public function relations()
    {
        return array(
                        'schools' => array(self::MANY_MANY, 'School', 'user_school(school_id, user_id)'),
        );
    }
        public function renderSchool($data=null,$row=0)
        {   
            $tmpds = Tutor::model()->with('schools')->findAll($data ? $data->user_id : $this->user_id);
            print_r($tmpds);
            $array = array();
            foreach ($tmpds as $tmpd)
               $array[] = $tmpd ? $tmpd->name : '';
               return $array;
        }
}
 
view/admin.php

Код: Выделить всё

<?php $this->widget('zii.widgets.grid.CGridView', array(
    'id'=>'tutor-grid',
    'enablePagination'=>true,
    'dataProvider'=>$model->search(),
    'filter'=>$model,
    'columns'=>array(
        'id',
        array('name'=> Yii::t('labels','model.school.name'), 
            'filter'=>'',
            'value'=> '$data->renderSchool()'
        ),
        array('class'=>'CButtonColumn',    
        ),
    ),
)); ?>
Последний раз редактировалось Reinchold 2013.06.26, 09:57, всего редактировалось 1 раз.
Reinchold
Сообщения: 48
Зарегистрирован: 2013.01.17, 02:19

Re: Построение SQL-запроса при помощи yii

Сообщение Reinchold »

У меня есть три таблицы:
И притом через Foreign Keys соеденены только "user_school" с "school"

tutor
id--------user_id-------supervisor_id
12-------2-------------9

user_school
user_id--------school_id--------id
1-------------14--------------1
2-------------15--------------2
7-------------13--------------3
2-------------14--------------4

school
id-----lang_id-----name
13----1----------School-1
14----1----------School-2
15----1----------School-3
Reinchold
Сообщения: 48
Зарегистрирован: 2013.01.17, 02:19

Re: Построение SQL-запроса при помощи yii

Сообщение Reinchold »

пришлось таким образом выкручиваться...

Код: Выделить всё

        public function renderSchool($data=null,$row=0)
        {   
            $sql = "SELECT * FROM school
                    JOIN user_school
                    JOIN tutor
                    WHERE school.id = user_school.school_id 
                      AND user_school.user_id = tutor.user_id 
                    ";
            $tmpds = School::model()->findAllBySql($sql);
//            print_r($tmpds);
            $array = array();
            foreach ($tmpds as $tmpd)
               $array[] = $tmpds ? $tmpd->name : '';
               return $array;
        }
Но вот ещё в чём вопрос, как теперь с фильтром быть?
как заставить его ратотать???
Аватара пользователя
Neuromance
Сообщения: 716
Зарегистрирован: 2011.09.06, 13:04

Re: Построение SQL-запроса при помощи yii

Сообщение Neuromance »

Reinchold писал(а):пришлось таким образом выкручиваться...

Код: Выделить всё

        public function renderSchool($data=null,$row=0)
        {   
            $sql = "SELECT * FROM school
                    JOIN user_school
                    JOIN tutor
                    WHERE school.id = user_school.school_id 
                      AND user_school.user_id = tutor.user_id 
                    ";
            $tmpds = School::model()->findAllBySql($sql);
//            print_r($tmpds);
            $array = array();
            foreach ($tmpds as $tmpd)
               $array[] = $tmpds ? $tmpd->name : '';
               return $array;
        }
 
Но вот ещё в чём вопрос, как теперь с фильтром быть?
как заставить его ратотать???
У меня только 2 вопроса
1. Почему таблицы связываешь так неудобно. Вместо использования ON связываешь их в WHERE ?
2. Какой результат выполнения этого кода? :lol:

Код: Выделить всё

foreach ($tmpds as $tmpd)
   $array[] = $tmpds ? $tmpd->name : '';
то есть результат то есть всегда, зачем тут условие внутри цикла?
Видимо имелось ввиду что-то такое

Код: Выделить всё

foreach ($tmpds as $tmpd)
   $array[] = $tmpd ? $tmpd->name : '';
Ответить