Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > [ORM] HAS_MANY, MANY_MANY


Автор: Sanchezzz 23.3.2013, 20:33
Добрый вечер. 
Правильно ли я понимаю что HAS_MANY, MANY_MANY используют отдельные запросами к БД для получения данных для связанных моделей,  в популярных ORM: Yii AR, kohana ORM.

Автор: Aliance 25.3.2013, 10:46
В Kohana да, отдельными.

Автор: georgiy11 31.3.2013, 00:19
Могут конструктором создаваться в join или подзапросами, этим регулируется флаг. Хотя возможно и создаются с помощью lazy_load, что более вероятней по дефолту, при запросе к связи происходит запрос к SQL.
Мвязи фактически используют ключ, как в YII, для префикса к алиасам при выборке, что бы можно было потом разобрать запрос на корректную структуру.

Автор: Sanchezzz 1.4.2013, 20:18
В общем пока ехал в поезде без интернета было достойно времени покапатся в Yii  AR модели + связью с ней моделью количеством 5 штук.

По умолчанию для HAS_MANY, HAS_ONE используется LEFT OUTER JOIN,  а может и для всех видов связи, не было желания дальше это выеснять.
Результат запроса со связанными моделями HAS_MANY с LEFT OUTER JOIN Приходят вот в таком виде
Код

m1_id | m1_name |  m2_id  | m2_name | m2_fk |
   1          Вася           2             Маша          1
   2          Вася           3             Оляга          1
   3          Саша         4             Света          3

Потом это все с пивом и водкой перекручивается и запихивается в модели и в массивик и отдается как результат.

Я пошел почти тем же путем  что и YII только я использую LEFT OUTER JOIN  только для связей HAS_ONE
HAS_MANY сделал путем получения всех PK из первого результата и дополнительного поиска по PK указанного в relation
В принципе получилось довольно шустро и компактно.  Сохранение моделей работает как В YII+WithRelatedBehavior, что бы не мучатся. 


Кстати с праздником  smile 



Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)