Выборка с глубокими связями
Выборка с глубокими связями
Добрый день.
Недавно писал вопрос по поиску с глубокими связями, теперь проблема с выборкой
Есть Таблица1, Таблица2, Таблица3. Связаны в соответствующем порядке по принципу HAS_MANY к нижней таблице.
То есть Таблица1->n записей из Таблица2->z*n записей из Таблица3.
Соответственно я открываю запись из Таблица1. Связи в моделях везде указаны. Но дочерние записи я могу получить только для Таблица2.
Можно ли как то без написания тонны кода, в рамках функционала Yii сделать сразу глубокую выборку, получив dataProvider из Таблица3?
Недавно писал вопрос по поиску с глубокими связями, теперь проблема с выборкой
Есть Таблица1, Таблица2, Таблица3. Связаны в соответствующем порядке по принципу HAS_MANY к нижней таблице.
То есть Таблица1->n записей из Таблица2->z*n записей из Таблица3.
Соответственно я открываю запись из Таблица1. Связи в моделях везде указаны. Но дочерние записи я могу получить только для Таблица2.
Можно ли как то без написания тонны кода, в рамках функционала Yii сделать сразу глубокую выборку, получив dataProvider из Таблица3?
Последний раз редактировалось lnghost 2011.08.12, 11:27, всего редактировалось 2 раза.
Re: Выборка с глубокими связями
http://yiiframework.ru/doc/guide/ru/database.arr
Реляционные запросы с through
Насколько я понял Вы про это
Реляционные запросы с through
Насколько я понял Вы про это
Re: Выборка с глубокими связями
Большое спасибо, помогло. И статья отличная, почему-то не нашел сразу.systemiv писал(а):http://yiiframework.ru/doc/guide/ru/database.arr
Реляционные запросы с through
Насколько я понял Вы про это
Re: [РЕШЕНО] Выборка с глубокими связями
Возникла проблема.
У меня есть схема данных:
table1.id -> table2.table1_id -> table3.table2_id
Есть релейшен:
Какой получается косяк. tables2 выбирается правильно, а вот tables3 смотрит на id из tables2 и выбирает из tables3 данные с тем же id. То есть, как я понял, выборка идет по праймерикеям, а мне нужно выбрать по ячейке table3.table2_id.
Условно сейчас запрос выглядит так:
А должен так:
У меня есть схема данных:
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')
Условно сейчас запрос выглядит так:
Код: Выделить всё
LEFT OUTER JOIN `table2` `tables2` ON (`tables1`.`Id`=`tables2`.`Id`)
Код: Выделить всё
LEFT OUTER JOIN `table2` `tables2` ON (`tables1`.`Id`=`tables2`.`table1_id`)
Re: Выборка с глубокими связями
Код: Выделить всё
'tables3'=>array(self::HAS_MANY, 'Table3', 'tables2_id', 'through'=>'tables2')
Re: Выборка с глубокими связями
Тогда он ругается, что у сущности Table2 нет проперти 'tables2_id.alexk984 писал(а):Так может надо?Код: Выделить всё
'tables3'=>array(self::HAS_MANY, 'Table3', 'tables2_id', 'through'=>'tables2')
Я так понимаю, третьим параметром указывается ячейка с другой стороны связи. А с этой стороны видимо берется праймери кей, то есть 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" такого столбца не существует.
Re: Выборка с глубокими связями
Смотрите тему viewtopic.php?f=6&t=3765
При таком виде связей использование through невозможно.
При таком виде связей использование through невозможно.
[Редкие] Записки пещерного человека
Re: Выборка с глубокими связями
ну правильно, там вроде table1_idlnghost писал(а):Тогда он ругается, что у сущности Table2 нет проперти 'tables2_id.alexk984 писал(а):Так может надо?Код: Выделить всё
'tables3'=>array(self::HAS_MANY, 'Table3', 'tables2_id', 'through'=>'tables2')
а tables2_id, видимо, следует искать в Table3Код: Выделить всё
ON (`tables1`.`Id`=`tables2`.`table1_id`)
...
Re: Выборка с глубокими связями
Или я вас не понимаю, или вы меня
Есть Country, дальше идут связи к resorts->hotels->permits.
resorts выбирается правильно. У меня указано, по какому полю в таблице resorts надо искать (CountryId).
А дальше начинается бред.
Тут сказано, что нужно выбрать из hotels, сравнивая hotels.PK с resorts.Id. И поля в замену праймери кея нельзя указать, а мне нужно выбирать вовсе даже не по Id, а по ResortId.
Вот о чем вопрос. Оно выбирает как-бы мм... не в ту сторону.
Код: Выделить всё
'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'),
resorts выбирается правильно. У меня указано, по какому полю в таблице resorts надо искать (CountryId).
А дальше начинается бред.
Код: Выделить всё
'hotels'=>array(self::HAS_MANY, 'Hotel', 'Id', 'through'=>'resorts'),
Вот о чем вопрос. Оно выбирает как-бы мм... не в ту сторону.