CDbCriteria - условие по подчиненной таблице

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
shimbo
Сообщения: 28
Зарегистрирован: 2013.06.14, 17:51

CDbCriteria - условие по подчиненной таблице

Сообщение shimbo »

помогите составить запрос для поиска, все выходные угробил, но так и не осилил.
итак, для начала - структура.
таблица №1 (tab1):
поля:
id
name
.. еще какие-то поля

таблица №2 (tab2):
поля:
id
id_tab1
created
value
.. еще какие-то поля

связь прописана: id_tab1 - ссылка на поле tab1.id

ЗАДАЧА.
выбрать записи из таблицы №1 (tab1), соответствующие выбранным полям и (если заполнено соответствующее поле) удовлетворяющие условию:
отсортировать tab2 по полю tab2.created в порядке убывания, выбрать первую запись (т.е. взять последнюю по времени запись в tab2) и проверить, соответствует ли у этой записи tab2.value определенному значению (поле на форме поиска).
задача осложняется тем, что база - oracle, соответственно лимитов нету, либо получить его можно только через одно место.

вариант решения №1.
писать запрос на чистом sql и использовать потом CSqlDataProvider
вариант не очень удобен.

вариант решения №2.
составляю запрос для поиска по tab1. за основу взял serch() сгенерированный gii crud
однако как добавить условие по подчиненной таблице - ума не приложу.
смотрел в сторону $criteria->with(), однако не смог осилить :(

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

    public function search() {
        // @todo Please modify the following code to remove attributes that should not be searched.

        $criteria = new CDbCriteria;

        $criteria->compare('id', $this->id);
        $criteria->compare('поле', $this->поле);
        // вот тут нужно добавить условие

        return new CActiveDataProvider($this, array('criteria' => $criteria, ));
    }
хотелось бы все-таки реализовать поиск вторым вариантом.

что скажите, дамы и господа?
может кто-то помочь в написании условия?
Аватара пользователя
flashimage
Сообщения: 1517
Зарегистрирован: 2011.01.23, 12:43

Re: CDbCriteria - условие по подчиненной таблице

Сообщение flashimage »

Насколько я правильно понял вы создали связь только в mySql. Для активрекорда создаются свои связи, потом используйте наздоровье и with и together и....
Сначала прочитайте это
http://www.yiiframework.com/doc/guide/1 ... tabase.arr
потом это
http://devkp.ru/post/primer-ispolzovaniya-cdbcriteria
Бранчи это гомеоморфические эндофункторы, которые мапятся на субманифолды пространства Гилберта.
shimbo
Сообщения: 28
Зарегистрирован: 2013.06.14, 17:51

Re: CDbCriteria - условие по подчиненной таблице

Сообщение shimbo »

еще раз, это не mySql, это oracle
связи в моделе конечно же созданы, самим фреймворком при генерации моделей.
ссылки видел и перечитывал не единожды. однако вот не выходит, потому и спрашиваю помощи.
masson
Сообщения: 545
Зарегистрирован: 2012.07.03, 15:59

Re: CDbCriteria - условие по подчиненной таблице

Сообщение masson »

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

    public function search() {
        $criteria = new CDbCriteria;
        // $criteria->compare('id', $this->id);    // Это видимо лишнее

        if(!empty($this->field)) {
            $cmd = Yii::app()-db->createCommand();
            $ids = $cmd->select('id_tab1')->from('tab2')->where(bla-bla-bla)->order(bla-bla-bla)->queryColumn();
            $criteria->addInCondition('id', $ids);    // Привязываем к id
            // $criteria->compare('field_name', $this->field);    // Дополнительно, если нужно
        }

        return new CActiveDataProvider($this, array('criteria' => $criteria, ));
    }
shimbo
Сообщения: 28
Зарегистрирован: 2013.06.14, 17:51

Re: CDbCriteria - условие по подчиненной таблице

Сообщение shimbo »

спасибо, но боюсь такой подход не спасет.
хотя сама идея получить список tab1.id удовлетворяющих условию путём вызова CDbConnection::createCommand() заинтересовала. однако не уверен сработает ли тут limit.
попробую.
masson
Сообщения: 545
Зарегистрирован: 2012.07.03, 15:59

Re: CDbCriteria - условие по подчиненной таблице

Сообщение masson »

Если вместо queryColumn сделать queryScalar - то выберет только самую первую запись
Ну или из массива $ids можно ч/з array_slice выбрать сколько надо, он уже отсортирован.
shimbo
Сообщения: 28
Зарегистрирован: 2013.06.14, 17:51

Re: CDbCriteria - условие по подчиненной таблице

Сообщение shimbo »

не, смотри, у меня подчиненная таблица.
груба говоря есть таблица обьектов и таблица логов.
в таблице логов для каждого объекта пишется история изменений с полями дата и тип_изменения.
так вот, мне надо отобрать те объекты, у которых последнее изменение имеет определенный тип.
Ответить