Страница 1 из 1
Как организовать такой релейшн?
Добавлено: 2012.01.13, 10:56
mitaichik
Всем привет) Чего-то седня туплю, никак не могу понять как преобразовать этот метод в релейшн:
Код: Выделить всё
/**
* Возвращает соседние офферы, т.е. офферы с таким-же requestId
* @todo Сделать его релейшеном
* @return array
*/
public function getSiblings(){
return Offer::model()->findAllByAttributes(array('request_id' => $this->request_id));
}
Т.е. он должен вернуть модели того-же класса, у которых совподает поле request_id с текущей моделью
Re: Как организовать такой релейшн?
Добавлено: 2012.01.13, 12:06
esche
Как-то так.. примерно:
Код: Выделить всё
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)
);
}
Ну и, по идее, себя не надо выбирать - т.е.
viewtopic.php?f=3&t=920
Re: Как организовать такой релейшн?
Добавлено: 2012.01.13, 13:00
Caveman
esche писал(а):Код: Выделить всё
'siblings' => array(self::HAS_MANY, 'Offer', '', 'on' => $alias.'request_id=siblings.request_id','together'=>true)
Ну и, по идее, себя не надо выбирать - т.е.
Теперь можно делать связь по любому полю:
Код: Выделить всё
'siblings' => array(self::HAS_MANY, 'Offer', array('request_id'=>'request_id'),'condition'=>$alias.'.id <> siblings.id')
Но условие того, что это не текущий объект, будет работать только с with('siblings').
Re: Как организовать такой релейшн?
Добавлено: 2012.01.13, 14:06
mitaichik
Caveman писал(а):
Теперь можно делать связь по любому полю:
Код: Выделить всё
'siblings' => array(self::HAS_MANY, 'Offer', array('request_id'=>'request_id'),'condition'=>$alias.'.id <> siblings.id')
Но условие того, что это не текущий объект, будет работать только с with('siblings').
Круто! Спасибо ))
Re: Как организовать такой релейшн?
Добавлено: 2012.01.13, 17:00
esche
За "беспорядочные" связи - спасибо...
Caveman писал(а):Но условие того, что это не текущий объект, будет работать только с with('siblings').
А 'together'=>true разве не достаточно?
Re: Как организовать такой релейшн?
Добавлено: 2012.01.14, 21:23
Caveman
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')
(поэкспериментировал немного, пару десятков строк кода во фреймворк и вышеописанная конструкция начинает работать
)