[sql]SELECT * FROM `bill_of_lading` INNER JOIN `bill_of_lading_status` ON `bill_of_lading`.`bill_of_lading_status_id` = `bill_of_lading_status`.`bill_of_lading_status_id` INNER JOIN `user` ON `bill_of_lading`.`user_id` = `user`.`user_id` INNER JOIN `customer` ON `user`.`customer_id` = `customer`.`customer_id` INNER JOIN `customer` AS `customer_2` ON `bill_of_lading`.`bill_of_lading_consignor` = `customer_2`.`customer_id` INNER JOIN `customer` AS `customer_3` ON `bill_of_lading`.`bill_of_lading_consignee` = `customer_3`.`customer_id` INNER JOIN `customer` AS `customer_4` ON `bill_of_lading`.`bill_of_lading_carrier` = `customer_4`.`customer_id` INNER JOIN `offer` ON `bill_of_lading`.`bill_of_lading_offer_carrier` = `offer`.`offer_id` INNER JOIN `customer` AS `customer_5` ON `offer`.`customer_id` = `customer_5`.`customer_id` INNER JOIN `city` ON `offer`.`offer_source` = `city`.`city_id` INNER JOIN `country` ON `city`.`country_id` = `country`.`country_id` LEFT JOIN `city` AS `city_2` ON `offer`.`offer_target` = `city_2`.`city_id` LEFT JOIN `country` AS `country_2` ON `city_2`.`country_id` = `country_2`.`country_id` INNER JOIN `location` ON `offer`.`offer_subject` = `location`.`location_id` INNER JOIN `customer` AS `customer_6` ON `location`.`customer_id` = `customer_6`.`customer_id` INNER JOIN `location_type` ON `location`.`location_type_id` = `location_type`.`location_type_id` INNER JOIN `offer_status` ON `offer`.`offer_status_id` = `offer_status`.`offer_status_id` LEFT JOIN `item` ON `offer`.`offer_object` = `item`.`item_id` LEFT JOIN `customer` AS `customer_7` ON `item`.`customer_id` = `customer_7`.`customer_id` LEFT JOIN `weight_measure` ON `item`.`weight_measure_id` = `weight_measure`.`weight_measure_id` LEFT JOIN `volume_measure` ON `item`.`volume_measure_id` = `volume_measure`.`volume_measure_id` LEFT JOIN `package_type` ON `item`.`package_type_id` = `package_type`.`package_type_id` LEFT JOIN `user` AS `user_2` ON `item`.`user_id` = `user_2`.`user_id` LEFT JOIN `customer` AS `customer_8` ON `user_2`.`customer_id` = `customer_8`.`customer_id` INNER JOIN `offer_type` ON `offer`.`offer_type_id` = `offer_type`.`offer_type_id` INNER JOIN `user` AS `user_3` ON `offer`.`user_id` = `user_3`.`user_id` INNER JOIN `customer` AS `customer_9` ON `user_3`.`customer_id` = `customer_9`.`customer_id` INNER JOIN `currency` ON `offer`.`currency_code` = `currency`.`currency_code` INNER JOIN `offer` AS `offer_2` ON `bill_of_lading`.`bill_of_lading_offer_consignor` = `offer_2`.`offer_id` INNER JOIN `customer` AS `customer_10` ON `offer`.`customer_id` = `customer_10`.`customer_id` LEFT JOIN `city` AS `city_3` ON `offer`.`offer_source` = `city_3`.`city_id` LEFT JOIN `country` AS `country_3` ON `city_3`.`country_id` = `country_3`.`country_id` LEFT JOIN `city` AS `city_4` ON `offer`.`offer_target` = `city_4`.`city_id` LEFT JOIN `country` AS `country_4` ON `city_4`.`country_id` = `country_4`.`country_id` INNER JOIN `location` AS `location_2` ON `offer`.`offer_subject` = `location_2`.`location_id` INNER JOIN `customer` AS `customer_11` ON `location`.`customer_id` = `customer_11`.`customer_id` INNER JOIN `location_type` AS `location_type_2` ON `location`.`location_type_id` = `location_type_2`.`location_type_id` INNER JOIN `offer_status` AS `offer_status_2` ON `offer`.`offer_status_id` = `offer_status_2`.`offer_status_id` LEFT JOIN `item` AS `item_2` ON `offer`.`offer_object` = `item_2`.`item_id` LEFT JOIN `customer` AS `customer_12` ON `item_2`.`customer_id` = `customer_12`.`customer_id` LEFT JOIN `weight_measure` AS `weight_measure_2` ON `item_2`.`weight_measure_id` = `weight_measure_2`.`weight_measure_id` LEFT JOIN `volume_measure` AS `volume_measure_2` ON `item_2`.`volume_measure_id` = `volume_measure_2`.`volume_measure_id` LEFT JOIN `adr_class` AS `adr_class_2` ON `item_2`.`adr_class_id` = `adr_class_2`.`adr_class_id` LEFT JOIN `item_type` AS `item_type_2` ON `item_2`.`item_type_id` = `item_type_2`.`item_type_id` LEFT JOIN `package_type` AS `package_type_2` ON `item_2`.`package_type_id` = `package_type_2`.`package_type_id` LEFT JOIN `user` AS `user_4` ON `item_2`.`user_id` = `user_4`.`user_id` LEFT JOIN `customer` AS `customer_13` ON `user_4`.`customer_id` = `customer_13`.`customer_id` LEFT JOIN `offer_type` AS `offer_type_2` ON `offer`.`offer_type_id` = `offer_type_2`.`offer_type_id` LEFT JOIN `user` AS `user_5` ON `offer`.`user_id` = `user_5`.`user_id` LEFT JOIN `customer` AS `customer_14` ON `user_5`.`customer_id` = `customer_14`.`customer_id` INNER JOIN `currency` AS `currency_2` ON `offer`.`currency_code` = `currency_2`.`currency_code` INNER JOIN `currency` AS `currency_3` ON `bill_of_lading`.`currency_code` = `currency_3`.`currency_code` WHERE (`bill_of_lading`.`bill_of_lading_status_id` = 1)[/sql]
а это т руками вообще писал? [sql] INNER JOIN `customer` AS `customer_2` ON `bill_of_lading`.`bill_of_lading_consignor` = `customer_2`.`customer_id` INNER JOIN `customer` AS `customer_3` ON `bill_of_lading`.`bill_of_lading_consignee` = `customer_3`.`customer_id` INNER JOIN `customer` AS `customer_4` ON `bill_of_lading`.`bill_of_lading_carrier` = `customer_4`.`customer_id` [/sql] для таких дел есть спец. форум http://www.php.ru/forum/viewforum.php?f=4
Mr.M.I.T. Естественно не руками писал. Поэтому последуй моему совету - не выставляй себя дураком Padaboo Это транслитерация английского "ORM"
Это динамически собранный запрос. Ты его надеешься увидеть в коде? PHP: <?php $model = new Model_Mapper_BillOfLading(); $model->setPredefinedSelect($model->select()->from('bill_of_lading')->where('bill_of_lading.bill_of_lading_status_id = ?', 1)); var_dump($model->enableFullInfo()->setFullInfoDepth(6)->select()->assemble()); Но это не в репозитории
встречались мне и "сложнее запросы", написанные руками. В них используются много-много конструкции if else. Править такое "удовольствие" - малоприятное занятие. Я за ORM. Тот факт что много букв ни о чём не говорит. Без explain'a спорить о "красивости" sql-запроса нельзя
А когда кодогенераторы работали хорошо? =) Даже байт-код для реальных процессоров генерируется не идеально.
Вопрос не в том хорошо или нет. Вопрос в том, что ORM не знает что тебе нужно. И на нетипичных запросах их описание в терминах ORM ничуть не проще, чем написать запрос вчистую руками. А так - да, ORM вполне неплохи, к примеру, для говнокода Mr.M.I.T. с его 3мя таблицами на всю БД они вполне подходят и качественно ускоряют разработку. topas Zend_Db_Table с небольшими плюшками. Оно не "говно" - ORM они все такие. Если хочешь быстро, то - или вот такое простынчатое или серия из -надцати запросов. Хочешь иметь хороший запрос сложнее чем SELECT BY ID - пиши ручками. Я еще посмотрю как оно работает с кешированием если JOIN заменить на последовательные запросы.
Вот кстати, из той же серии. Скорость разработки vs скорость выполнения. По последнему профайлингу 46% времени заняли Zend_Config + Zend_Navigation
У нас не говнокод, таблиц много и мы используем ORM. Просто большинство связей lazy load, так как прослойка кеша есть.
MiksIr Ты путаешь причинно-следственную связь. Я не писал "ORM => говнокод" Вот именно, а это рождает не запрос как в 1м посте, а цепочку запросов. Более того, я уже говорил - ORM не запрещает собрать кошерный же запрос, просто, это не быстрее в написании.
Simpliest ну куда нам до твоих 3х строчек в ЗФ? ты за два месяца сколкьо написал? килобайт 200 то есть? врятли... Ps/ и я не использую ОРМ и таких запросаов у меня нет и вообще я думал ты это руками написал и за то чтобы это на орм "переписать"
а причём тут как они работают, главное где. у него там генерируются классы с 3мя св-вами ввиде массивов и таблицы.
Возможно (не факт), что взяв в руки ТЗ написать такой запрос руками и быстрее... чем создать все модели, прописать меж них связи и написать одну выгребающую строчку - запрос в ORM. Однако, наиболее вероятно, что работать он не будет, ибо где-то будет допущена ошибка... и дай бог если опечатка, а скорее всего пропущена какая-то связь. ORM может и не ускоряет время разработки, но вообще-то говнокодить всегда быстрее было, не знаю с чего ты скорость как критерий выкатил. А вот вероятность ошибок всякие ORM понижают... как и понимание того, что же тут наворочено через эдак годик.