Как организовать такой релейшн?

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
Аватара пользователя
mitaichik
Сообщения: 512
Зарегистрирован: 2010.09.24, 21:18
Откуда: Россия, Санкт-Петербург

Как организовать такой релейшн?

Сообщение mitaichik » 2012.01.13, 10:56

Всем привет) Чего-то седня туплю, никак не могу понять как преобразовать этот метод в релейшн:

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

    /**
     * Возвращает соседние офферы, т.е. офферы с таким-же requestId
     * @todo Сделать его релейшеном
     * @return array
     */
    public function getSiblings(){
        return Offer::model()->findAllByAttributes(array('request_id' => $this->request_id));
    }
 
Т.е. он должен вернуть модели того-же класса, у которых совподает поле request_id с текущей моделью

esche
Сообщения: 1054
Зарегистрирован: 2010.11.24, 03:39

Re: Как организовать такой релейшн?

Сообщение esche » 2012.01.13, 12:06

Как-то так.. примерно:

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

    public function relations()
    {
        $alias  = $this->getTableAlias(false, false);
        return array(
//....
            'siblings' => array(self::HAS_MANY, 'Offer', '', 'on' => '$alias.request_id=siblings.request_id','together'=>true)
        );
    }
 
Ну и, по идее, себя не надо выбирать - т.е.

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

"...AND $alias.id <> siblings.id";
viewtopic.php?f=3&t=920
...

Аватара пользователя
Caveman
Сообщения: 152
Зарегистрирован: 2009.04.04, 20:56
Откуда: Москва
Контактная информация:

Re: Как организовать такой релейшн?

Сообщение Caveman » 2012.01.13, 13:00

esche писал(а):

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

            'siblings' => array(self::HAS_MANY, 'Offer', '', 'on' => $alias.'request_id=siblings.request_id','together'=>true)
Ну и, по идее, себя не надо выбирать - т.е.

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

"...AND $alias.id <> siblings.id";
Теперь можно делать связь по любому полю:

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

'siblings' => array(self::HAS_MANY, 'Offer', array('request_id'=>'request_id'),'condition'=>$alias.'.id <> siblings.id')
Но условие того, что это не текущий объект, будет работать только с with('siblings').

Аватара пользователя
mitaichik
Сообщения: 512
Зарегистрирован: 2010.09.24, 21:18
Откуда: Россия, Санкт-Петербург

Re: Как организовать такой релейшн?

Сообщение mitaichik » 2012.01.13, 14:06

Caveman писал(а): Теперь можно делать связь по любому полю:

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

'siblings' => array(self::HAS_MANY, 'Offer', array('request_id'=>'request_id'),'condition'=>$alias.'.id <> siblings.id') 
Но условие того, что это не текущий объект, будет работать только с with('siblings').
Круто! Спасибо ))

esche
Сообщения: 1054
Зарегистрирован: 2010.11.24, 03:39

Re: Как организовать такой релейшн?

Сообщение esche » 2012.01.13, 17:00

За "беспорядочные" связи - спасибо...
Caveman писал(а):Но условие того, что это не текущий объект, будет работать только с with('siblings').
А 'together'=>true разве не достаточно?
...

Аватара пользователя
Caveman
Сообщения: 152
Зарегистрирован: 2009.04.04, 20:56
Откуда: Москва
Контактная информация:

Re: Как организовать такой релейшн?

Сообщение Caveman » 2012.01.14, 21:23

esche писал(а):За "беспорядочные" связи - спасибо...
Caveman писал(а):Но условие того, что это не текущий объект, будет работать только с with('siblings').
А 'together'=>true разве не достаточно?
Если по отдельности получаем сначала модель, а потом пытаемся получить ее соседей, то together не сработает, в любом случае будет выполнено 2 запроса.

Тут необходима некая метка, с помощью которой можно было передавать данные реальной модели в связь.
Что-то типа

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

'siblings' => array(self::HAS_MANY, 'Offer', array('request_id'=>'request_id'),'together'=>true, 'on' => 'siblings.id <> $this.id')
(поэкспериментировал немного, пару десятков строк кода во фреймворк и вышеописанная конструкция начинает работать :) )

Ответить