Alexandre DISTINCT в ORM это отдельная тема. Фактически DISTINCT-а быть не может, т.к. это образует новую сущность, с которой ORM не умеет работать, потому что она не декларирована.
Второй запрос рассматривать не будем, т.к. BulkLoad на предыдущей странице. Что касается последнего, то я не очень уверен, что проверка условия на каждой итерации это хорошее решение и что будет большая разница, если вынести такую проверку в код, но все же
PHP:
$banner = new Banner();
$banner->setLimit(20);
$banner->filterBy("banner_types_id",6);
$banner->filterBy("lang","eng");
$banner->filterBy("show",true);
$banner->filterCustom("((NOT except1 AND '%' LIKE url) OR (except1 AND '%' NOT LIKE url))");
По поводу BETWEEN чесслово лишние они тут, потому как заменить их на более простые аналоги можно запросто, при этом особо не напрягаясь. Даже если хочется btw, да наздоровье - кастом фильтр вам в руки.
При этом следует заметить, что вместе с ORM вы абстрагируетесь от конкретных идентификаторов, которые определены в СУБД, за счет алиасов. Вы запросто можете сменить карту псевдонимов и работать фактически с другой таблицей БД и даже, если так хочется, с другими полями. И это - одной строчкой! Для чего это может понадобиться? На вскидку - обернуть существующую таблицу, которая вам совсем не нравится своим названием или названием своих полей. Еще один пример - создание архивной таблицы (кстати, в целях той же самой пресловутой оптимизации), в которую будут переноситься более старые данные. Не трудно прикинуть, сколько строк надо будет вбить, если все писать native sql.
>Опять-таки, насколько, с вашей точки зрения, востребованы такие запросы? И насколько существующие ORM позволяют их реализовывать, не опускаясь к уровню SQL (то есть, насколько востребована такая функциональность)? Лично мне не нравится идея реализации такой обработки на уровне бизнес-логики, так как результатом может стать огромнейшее количество мелких запросов к базе.
Не знаю на сколько существующие ORM позволяют. Могу сказать что в 99% случаев речь идет о контролерах форм. Именно там возникает необходимость комплексно работать с несколькими сущностями.
Вот к примеру кусок лога запросов при выводе списка заказов. Предварительно список id ордеров сделан отдельным запросом с применением соотв. фильтров. Это сделано намеренно - нас не интересует головная боль, связанная с написанием супермегагиперпупермногостраничного запроса. У нас нет на это времени. Мы считаем, что один простой запрос обойдется нам дешевле, чем ломание нашей собственной головы в попытках написать что нибудь эдакое. Примерно такой поток мыслей сопровождает нас всегда. По этому мы все делаем так, что бы позволить ORM работать за нас. Мы думаем - он работает... но это так, отступление.
SELECT * FROM wcmf_tab_order WHERE id = 554
SELECT * FROM wcmf_tab_order_line WHERE owner = '554' ORDER BY line_no
SELECT * FROM wcmf_tab_product WHERE id = 6
SELECT * FROM wcmf_tab_order WHERE id = 555
SELECT * FROM wcmf_tab_order_line WHERE owner = '555' ORDER BY line_no
SELECT * FROM wcmf_tab_product WHERE id = 6
и таких 200 штук. Выполняется и правда не быстро. Но никаких сложных запросов здесь нет! Решение проблемы сводится к BulkLoad 3х сущностей. И ведь правильно получается - объекты работают _в_любом_случае_, а там где скорости не хватает _мы_оптимизируем_работу_. Контроллер - это специфичный объект, мы (программист) об этом знаем, по этому используем средства оптимизации.
Обратите внимание, мы оптимизируем там, где нас не устраивает скорость. В остальном ORM работает за нас. А противники ORM, пишут каждый запрос ручками, независимо от того критична здесь скорость или нет. Хотите сказать нет никакой разницы? Ну тогда можете писать на ассемблере - будет работать еще быстрее, если для вас это так важно. ORM для тех, кто ценит свое время.