Требуется помощь в переписании запроса под CDbCriteria?

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
okuznetsov
Сообщения: 4
Зарегистрирован: 2014.10.07, 19:34

Требуется помощь в переписании запроса под CDbCriteria?

Сообщение okuznetsov »

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

###Получаем из пользователей выполнявших бронирование в указанный интервал времени - только выборку пользователей не чего не бронировавших
SELECT 
t.userId,
a.name,
CONCAT('http://online-express.ru/office/agencies/',t.agencyId) AS urlAgency,
IF( a.enabled=1,"Нет",IF( a.enabled=0,"Да",null)) as enabledAgency2,
a.enabled as enabledAgency
FROM
bookings t
INNER JOIN users u ON (u.id = t.userId)
INNER JOIN agencies a ON (u.agencyId = a.id)
WHERE
u.activated = 1 AND 
u.enabled = 1 AND
a.enabled = 1 AND
t.userId NOT IN 

(
###Получаем из всех пользователй системы - только выборку пользователей выполнявших бронирование в указанный интервал времени
SELECT 
t.userId
FROM
bookings t
WHERE
t.createTime BETWEEN UNIX_TIMESTAMP(STR_TO_DATE('01-05-2016 00:00:00', '%d-%m-%Y %H:%i:%s')) AND UNIX_TIMESTAMP(STR_TO_DATE('01-06-2016 23:59:59', '%d-%m-%Y %H:%i:%s')) 
AND
t.userId IN (

###Делаем выборку всех действующих (активных, не заблокированных) пользователей нашей системы
SELECT 
u.id
FROM
users u
WHERE
u.activated = 1 AND 
u.enabled = 1

)
GROUP BY
t.agencyId
)

GROUP BY
t.agencyId
ORDER BY
t.userId ASC

; 
Аватара пользователя
Said
Сообщения: 138
Зарегистрирован: 2015.06.04, 10:16

Re: Требуется помощь в переписании запроса под CDbCriteria?

Сообщение Said »

Полезные статьи про "CDbCriteria":
http://www.bsourcecode.com/yii-framewor ... ia-in-yii/
http://devkp.ru/primer-ispolzovaniya-cdbcriteria/
http://devkp.ru/tag/cdbcriteria/

Решение:

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

    $criteria = new CDbCriteria();
    $criteria->select = "
        t.userId,
        a.name,
        CONCAT('http://online-express.ru/office/agencies/', t.agencyId) AS urlAgency,
        IF(a.enabled = 1, 'Нет', IF(a.enabled = 0, 'Да', NULL))         AS enabledAgency2,
        a.enabled                                                       AS enabledAgency
    ";

    $criteria->alias = 't';
    $criteria->join = '
        INNER JOIN users u ON (u.id = t.userId)
        INNER JOIN agencies a ON (u.agencyId = a.id)
    ';

    $criteria->addCondition("
      u.activated = :u_activated AND
      u.enabled = :u_enabled AND
      a.enabled = :a_enabled AND
      t.userId NOT IN
      (
        SELECT t.userId
        FROM
          bookings t
        WHERE
          t.createTime BETWEEN UNIX_TIMESTAMP(STR_TO_DATE(:create_time_from, '%d-%m-%Y %H:%i:%s')) AND UNIX_TIMESTAMP(
              STR_TO_DATE(:create_time_to, '%d-%m-%Y %H:%i:%s'))
          AND
          t.userId IN (
            SELECT u.id
            FROM
              users u
            WHERE
              u.activated = :u_activated AND
              u.enabled = :u_enabled
          )
        GROUP BY
          t.agencyId
      )
    ");
    $criteria->group = 't.agencyId';
    $criteria->order = 't.userId ASC';

    // Для динамического изменения значений
    $u_activated = 1;
    $u_enabled = 1;
    $a_enabled = 1;
    $create_time_from = '01-05-2016 00:00:00';
    $create_time_to = '01-06-2016 23:59:59';

    $criteria->params[':u_activated'] = $u_activated;
    $criteria->params[':u_enabled'] = $u_enabled;
    $criteria->params[':a_enabled'] = $a_enabled;
    $criteria->params[':create_time_from'] = $create_time_from;
    $criteria->params[':create_time_to'] = $create_time_to;

    return Bookings::model()->findAll($criteria);
 
Ответить