Как создавать объекты со связями не перегружая БД запросами?

Nicki

Новичок
Как создавать объекты со связями не перегружая БД запросами?

Помогите советом, или опытом поделитесь уважаемые профессионалы) Вот стал писать ООП модель со сложными (ну не очень) связями, но возникли небольшие затруднения... Хочется узнать как кто подобные ситуации обходит.

Вот у меня есть такие объекты: страна, конструкторское бюро, самолет... ну для примера достаточно. Допустим мне нужно вывести список самолей. Посылаем запрос, dataMapper'у с массивом параметров для отбора записей из БД: $aircrafts = $aircraftMapper->getAircrafts($conditions);. Метод должен вернуть массив объектов самолетов. Но для создания объекта нужно создать объект КБ (конструкторское бюро) и в объекте КБ объект Страна. Получается что создавая объект Самолет, мы должны уже иметь готовый объект КБ, а в нем объект Страны. Но делая запрос мапперу КБ на получение объекта (и соответственно его создание), мы будем каждый раз обращаться к базе за данными единственного КБ, а тот в свою очередь при создании запросит у базы данные для создания объекта Страна. В результате мы делаем 1 запрос на выборку данных по самолетам (например 30 самолетов из разных стран и КБ), и допустим при этом еще запускается 10 запросов к базе за данными КБ и, еще 3 запроса за данными стран. База ведь так быстро ляжет. Да, пусть у нас емть хэш КБ и хэш Стран, поэтому если объект был уже создан ранее он возьмется готовый из хэша, но все равно это будет не 3 запроса (по одному на самолеты, КБ, строны), а поболее.

Как быть в этой ситуации?
 

Wicked

Новичок
можно. вчера просто не было времени :)

есть такая ORM под названием doctrine.
В ней все сделано очень лениво. Поэтому, в твоем случае, когда нужны самолеты, doctrine бы из базы выбрала только их, а КБ и страну выбирала бы только когда ты их действительно хочешь. Из-за этого у тебя появляется момент, когда все самолеты уже выбраны, а КБ еще нет. Можешь ли ты каким-то образом выполнить один запрос, чтобы получить все относящиеся КБ, а потом их распихать по самолетам? Правильно, можешь.

А чтобы этим еще и пользоваться было удобно, предлагаю сделать, чтобы $aircraftMapper->getAircrafts($conditions); возвращал не массив, а объект класса а-ля доктриновской Collection. Тогда можно привести это к виду:
PHP:
$aircrafts = $aircraftMapper->getAircrafts($conditions);
$aircrafts->loadRelated('kb')->loadRelated('country'); // одним запросом выбираем все КБ для всех самолетов, и,
// поскольку loadRelated() тоже возвращает объект класса Collection (честно говоря, в доктрине это не так :)),
// вторым запросом выбираем все страны для всех КБ.
foreach($aircrafts as $aircraft) {
  print $aircraft->kb->country->name; // и тут уже не делается ни одного запроса
}
 

Nicki

Новичок
о как... классно. большое спасибо тебе что все так подробно рассказал)) буду юзать))
 

Wicked

Новичок
ну и стоит отметить, что подобное сделано в LightORM (найдешь поиском по форуму), и не очень сложно делается для орм Propel (но уже руками).
 

Nicki

Новичок
да, lightORM я уже нашел... почитал... А ты что посоветуешь, доктрин, лайтОРМ или пропел?
 
Во нашел тесты сравнения (LightOrm vs Propel vs Doctrine benchmark): http://phplightorm.wiki.sourceforge.net/LightOrm+vs+Propel+vs+Doctrine+benchmark
 

atv

Новичок
А ты что посоветуешь, доктрин, лайтОРМ или пропел?
Если ты новичёк в ORM и тем более в PHP, то лучше выбрать более стабильный проект. Более стабильным мне кажеться Propel, тебе хватит его за глаза. В Doctrine, по словам многих, много багов, а LightOrm сравнительно молодой проект, и требует определённого уровня энтузиазма.

Если, всё-таки, ты надумаешь попробовать LightOrm, то, во-первых, бери версию из SVN (она более свежая), а во-вторых, я, как автор, обещаю поддержку.
 

Nicki

Новичок
MiksIr
в каком смысле? обычный маппер... у фаулера почитал...

atv
ОРМ я только-только начинаю разбираться... Просто дол эитого с этим не сталкивался никогда.

Спасибо за помощь

-~{}~ 22.10.08 15:03:

Если, всё-таки, ты надумаешь попробовать LightOrm, то, во-первых, бери версию из SVN (она более свежая), а во-вторых, я, как автор, обещаю поддержку.
А svn это где? Тут лежит http://sourceforge.net/projects/phplightorm/ версия 0.3а
 

Nicki

Новичок
а... этим я пока тоже пользоваться не умею. спасибо за помощь большое.
 
Сверху