Помогите составить запрос

Темы, не касающиеся фреймворка, но относящиеся к программированию в целом.
Ответить
Аватара пользователя
Roksalana
Сообщения: 215
Зарегистрирован: 2014.01.14, 09:34

Помогите составить запрос

Сообщение Roksalana »

Уважаемые форумчане, помогите перевести запрос в формат ActiveRecord.
Запрос:

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

SELECT *
FROM `service_list` s
LEFT JOIN service s2k ON s2k.service_id = s.id
AND s2k.k_id =1
У меня есть модель ServiceList и Service. В ServiceList прописана связь:
'service' => array(self::HAS_ONE, 'Service', 'service_id'),
Нужно джоинить таблицы так, чтобы получались все данные из таблицы ServiceList + данные из Service если совпадает условие (там где k_id не совпадает будет просто null).

Пробую писать так:

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

$creteria = new CDbCriteria();
$creteria->join = "LEFT JOIN service ON service_id = t.id AND service.k_id = {$kID}";
return ServiceList::model()->findAll($creteria);
Результат запроса правильный, но не понимаю как получить доступ к данным выбранным из service
Если делаю так:

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

        return ServiceList::model()
            ->with(array(
            'service' => array(
                'joinType' => 'left join',
                'condition'=>"service.k_id = {$kID}",
            )
        ))
        ->findAll();
Доступ к данным таблицы service есть, но результат запроса не правильный. Возвращает только те строки из ServiceList для которых есть значение в service совпадающее с условиями. Как получить и пустые строки?

Понимаю, что можно написать напрямую SQL-запросом, но хочется сделать все правильно. Надеюсь на вашу помощь.
Аватара пользователя
nizsheanez
Сообщения: 814
Зарегистрирован: 2011.04.29, 13:09
Откуда: Москва

Re: Помогите составить запрос

Сообщение nizsheanez »

1) через DbCriteria нужно указать select * (по умолчанию выбираются только s.*), но учтите что модель ServiceList не содержит полей для хранения данных из s2k так что добалвяйте в ручную в этом варианте.
2) через Relation вам нужен не Left Join
Ответить