Свое определение связи в relations

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
Аватара пользователя
undsoft
Сообщения: 20
Зарегистрирован: 2009.09.16, 14:16

Свое определение связи в relations

Сообщение undsoft »

Есть такая проблема. Пишу что-то вроде бухгалтерии. Предположим есть 2 таблицы: Месяцы и Выплаты в этот месяц.
Как связать их в relations? Как выбирать к примеру выплаты за месяц используя relations используя sql поля date для этого?

Знаю, что можно написать свое условия для relations в таком виде:

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

public function relations()
    {
        return array(
            'payments'=>array(self::HAS_MANY, 'Payment','','on'=>'something here'),
)}
 
и дописать в on свое условие, например сравнение дат:
Дата платежа из Выплаты больше Даты начала месяца и меньше Даты конца месяца
но из-за HAS_MANY Yii создает дополнительный подзапрос к таблице Выплаты и соответственно там нет колонок из Месяцев.

Вобщем, непонятно как связать в on свои данные.
Последний раз редактировалось undsoft 2010.09.03, 14:27, всего редактировалось 2 раза.
Аватара пользователя
timlar
Сообщения: 1382
Зарегистрирован: 2009.09.19, 17:49
Откуда: Украина, Днепропетровск
Контактная информация:

Re: Свое определение связи в relations

Сообщение timlar »

$model->payments->... Я правильно понял?
Twitter: @timlar_ua
Аватара пользователя
undsoft
Сообщения: 20
Зарегистрирован: 2009.09.16, 14:16

Re: Свое определение связи в relations

Сообщение undsoft »

Ну да, я хочу, чтобы оно работало в таком виде.

Вторым вариантом было бы к примеру подставление параметров так:

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

public function relations(){
        return array(
            'payments'=>array(self::HAS_MANY, 'Payment','', 'on'=>'`date`>=:date_begin AND `date` <=  :date_end',
                'params'=>array(
                    ':date_begin'=>'задаем дату используя $this',
                    ':date_end'=>'задаем дату используя $this',
                )
            )
        );
    }
 
но так тоже не работает, потому что Yii выполняет relations еще до того, как в $this есть необходимые атрибуты.
Аватара пользователя
timlar
Сообщения: 1382
Зарегистрирован: 2009.09.19, 17:49
Откуда: Украина, Днепропетровск
Контактная информация:

Re: Свое определение связи в relations

Сообщение timlar »

В контроллере:

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

$model = Month::model()->with('payments')->findAll('--- запрос ---', array(':date_begin'=>..., ':date_end'=>...)); 
Реляцию делаем так:

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

public function relations(){
        return array(
            'payments'=>array(self::HAS_MANY, 'Payment','', 'on'=>'t.date >= :date_begin AND t.date <= :date_end')
        );
    } 
Twitter: @timlar_ua
Аватара пользователя
undsoft
Сообщения: 20
Зарегистрирован: 2009.09.16, 14:16

Re: Свое определение связи в relations

Сообщение undsoft »

Да, спасибо, о таком решении я не подумал.
Правда теперь не понятно, зачем использовать relations, ведь она равносильна выборке из Payment.

Пока придумал такое извращение:

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

public function relations(){
        return array(
            'payments'=>array(self::HAS_MANY, 'Payment','', 
                      'on'=>'`date`>=столбец_из_таблицы_месяцев AND `date` <= столбец_из_таблицы_месяцев',
            )
        );
    }
 
Так будет работать, но только в случае жадной загрузки.
Аватара пользователя
aser
Сообщения: 167
Зарегистрирован: 2009.04.02, 14:25
Откуда: Киев

Re: Свое определение связи в relations

Сообщение aser »

Правда теперь не понятно, зачем использовать relations, ведь она равносильна выборке из Payment.
Так меньше строк писать ;)
together: параметр, устанавливающий необходимость принудительного объединения таблицы, ассоциированной с этим отношением, с другими таблицами. Этот параметр имеет смысл только для отношений типов HAS_MANY и MANY_MANY. Если параметр не установлен или равен false, тогда каждое отношение HAS_MANY или MANY_MANY будет использовать отдельный SQL запрос для связанных данных, что может улучшить скорость выполнения запроса т.к. уменьшается количество выбираемых данных. По умолчанию параметр равен true. Более подробное описание см. в разделе «производительность реляционного запроса». Параметр доступен, начиная с версии 1.0.3;
Аватара пользователя
undsoft
Сообщения: 20
Зарегистрирован: 2009.09.16, 14:16

Re: Свое определение связи в relations

Сообщение undsoft »

together указанный в relations не оказывает никакого эффекта. по-моему это упущение.
Аватара пользователя
aser
Сообщения: 167
Зарегистрирован: 2009.04.02, 14:25
Откуда: Киев

Re: Свое определение связи в relations

Сообщение aser »

undsoft писал(а):together указанный в relations не оказывает никакого эффекта. по-моему это упущение.
Это да, хотя по документация вроде как так можно делать :), не знаю как в 1.1.3 но в 1.1.1 точно не работал. Нужно было делать только так

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

$model = Month::model()->with('payments')->together()->findAll('--- запрос ---', array(':date_begin'=>..., ':date_end'=>...)); 
 
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Свое определение связи в relations

Сообщение samdark »

В 1.1.4 по идее должен. Послезавтра можно будет попробовать.
Аватара пользователя
undsoft
Сообщения: 20
Зарегистрирован: 2009.09.16, 14:16

Re: Свое определение связи в relations

Сообщение undsoft »

Ладно, еще можно сделать в таблице Месяцев искуственный праймари ки - id какой-нибудь, а в других таблицах ссылаться на него. По-моему это overkill, зато можно будет пользоваться фичами yii без костылей.
Аватара пользователя
aser
Сообщения: 167
Зарегистрирован: 2009.04.02, 14:25
Откуда: Киев

Re: Свое определение связи в relations

Сообщение aser »

А все же я не догнал зачем таблица месяцев, они что не стандартные или как? Каждый месяц и так имеет уже свой id от 1 до 12

По моему тут какой-то избыток :)
Аватара пользователя
undsoft
Сообщения: 20
Зарегистрирован: 2009.09.16, 14:16

Re: Свое определение связи в relations

Сообщение undsoft »

Есть дополнительная информация, которую нужно хранить вместе с месяцем. Например, количество рабочих дней.

Кроме того, значительно веселее писать :D :

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

$month = Month::model()->current()->find();

$month->payments ...
 
чем делать какой-то скучный Payment::model()->findAll(array(....))
Ответить