Выборка с глубокими связями

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
lnghost
Сообщения: 134
Зарегистрирован: 2011.07.26, 18:05
Откуда: Воронеж
Контактная информация:

Выборка с глубокими связями

Сообщение lnghost »

Добрый день.
Недавно писал вопрос по поиску с глубокими связями, теперь проблема с выборкой :)
Есть Таблица1, Таблица2, Таблица3. Связаны в соответствующем порядке по принципу HAS_MANY к нижней таблице.
То есть Таблица1->n записей из Таблица2->z*n записей из Таблица3.
Соответственно я открываю запись из Таблица1. Связи в моделях везде указаны. Но дочерние записи я могу получить только для Таблица2.
Можно ли как то без написания тонны кода, в рамках функционала Yii сделать сразу глубокую выборку, получив dataProvider из Таблица3?
Последний раз редактировалось lnghost 2011.08.12, 11:27, всего редактировалось 2 раза.
Конференция: yii@conference.jabber.ru Сайт: http://kamaran.ru

systemiv
Сообщения: 360
Зарегистрирован: 2011.06.26, 22:55
Откуда: Липецк
Контактная информация:

Re: Выборка с глубокими связями

Сообщение systemiv »

http://yiiframework.ru/doc/guide/ru/database.arr
Реляционные запросы с through
Насколько я понял Вы про это

lnghost
Сообщения: 134
Зарегистрирован: 2011.07.26, 18:05
Откуда: Воронеж
Контактная информация:

Re: Выборка с глубокими связями

Сообщение lnghost »

systemiv писал(а):http://yiiframework.ru/doc/guide/ru/database.arr
Реляционные запросы с through
Насколько я понял Вы про это
Большое спасибо, помогло. И статья отличная, почему-то не нашел сразу.
Конференция: yii@conference.jabber.ru Сайт: http://kamaran.ru

lnghost
Сообщения: 134
Зарегистрирован: 2011.07.26, 18:05
Откуда: Воронеж
Контактная информация:

Re: [РЕШЕНО] Выборка с глубокими связями

Сообщение lnghost »

Возникла проблема.
У меня есть схема данных:
table1.id -> table2.table1_id -> table3.table2_id

Есть релейшен:

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

'tables2' => array(self::HAS_MANY, 'Table2', 'table1_id'),
'tables3'=>array(self::HAS_MANY, 'Table3', 'id', 'through'=>'tables2') 
Какой получается косяк. tables2 выбирается правильно, а вот tables3 смотрит на id из tables2 и выбирает из tables3 данные с тем же id. То есть, как я понял, выборка идет по праймерикеям, а мне нужно выбрать по ячейке table3.table2_id.

Условно сейчас запрос выглядит так:

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

LEFT OUTER JOIN `table2` `tables2` ON (`tables1`.`Id`=`tables2`.`Id`) 
А должен так:

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

LEFT OUTER JOIN `table2` `tables2` ON (`tables1`.`Id`=`tables2`.`table1_id`) 
Конференция: yii@conference.jabber.ru Сайт: http://kamaran.ru

Аватара пользователя
alexk984
Сообщения: 433
Зарегистрирован: 2010.10.21, 15:03
Контактная информация:

Re: Выборка с глубокими связями

Сообщение alexk984 »

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

'tables3'=>array(self::HAS_MANY, 'Table3', 'tables2_id', 'through'=>'tables2') 
Так может надо?

lnghost
Сообщения: 134
Зарегистрирован: 2011.07.26, 18:05
Откуда: Воронеж
Контактная информация:

Re: Выборка с глубокими связями

Сообщение lnghost »

alexk984 писал(а):

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

'tables3'=>array(self::HAS_MANY, 'Table3', 'tables2_id', 'through'=>'tables2') 
Так может надо?
Тогда он ругается, что у сущности Table2 нет проперти 'tables2_id.
Я так понимаю, третьим параметром указывается ячейка с другой стороны связи. А с этой стороны видимо берется праймери кей, то есть id в данном случае. А должно все наоборот быть.
Уже кучей манов учитался, так и не понял, что сделать.


Реально оно выглядит так:

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

'resorts' => array(self::HAS_MANY, 'Resort', 'CountryId'),
'hotels'=>array(self::HAS_MANY, 'Hotel', 'ResortId', 'through'=>'resorts'),
'permits'=>array(self::HAS_MANY, 'Permit', 'Id', 'through'=>'hotels'), 
И ругается так:

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

Отношение "resorts" AR модели "Country" определено с использованием неверного внешнего ключа "ResortId". В таблице "resort" такого столбца не существует.  
Конференция: yii@conference.jabber.ru Сайт: http://kamaran.ru

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

Re: Выборка с глубокими связями

Сообщение Caveman »

Смотрите тему viewtopic.php?f=6&t=3765
При таком виде связей использование through невозможно.

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

Re: Выборка с глубокими связями

Сообщение esche »

lnghost писал(а):
alexk984 писал(а):

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

'tables3'=>array(self::HAS_MANY, 'Table3', 'tables2_id', 'through'=>'tables2') 
Так может надо?
Тогда он ругается, что у сущности Table2 нет проперти 'tables2_id.
ну правильно, там вроде table1_id

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

ON (`tables1`.`Id`=`tables2`.`table1_id`)  
а tables2_id, видимо, следует искать в Table3
...

lnghost
Сообщения: 134
Зарегистрирован: 2011.07.26, 18:05
Откуда: Воронеж
Контактная информация:

Re: Выборка с глубокими связями

Сообщение lnghost »

Или я вас не понимаю, или вы меня :)

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

'resorts' => array(self::HAS_MANY, 'Resort', 'CountryId'),
'hotels'=>array(self::HAS_MANY, 'Hotel', 'Id', 'through'=>'resorts'),
'permits'=>array(self::HAS_MANY, 'Permit', 'Id', 'through'=>'hotels'), 
Есть Country, дальше идут связи к resorts->hotels->permits.
resorts выбирается правильно. У меня указано, по какому полю в таблице resorts надо искать (CountryId).
А дальше начинается бред.

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

'hotels'=>array(self::HAS_MANY, 'Hotel', 'Id', 'through'=>'resorts'), 
Тут сказано, что нужно выбрать из hotels, сравнивая hotels.PK с resorts.Id. И поля в замену праймери кея нельзя указать, а мне нужно выбирать вовсе даже не по Id, а по ResortId.
Вот о чем вопрос. Оно выбирает как-бы мм... не в ту сторону.
Конференция: yii@conference.jabber.ru Сайт: http://kamaran.ru

Ответить