Конструирование запроса с использование JOIN в Kohana3
Предстояло мне сформировать запрос с использование 2-х таблиц связанных с помощью конструкции JOIN. Беда была в том, что таблицы имели префикс (test_), который был указан в конфиге БД и к созданным алиасам, указанных таблиц, цеплялся префикс таблицы.
Ниже приведен запрос который был после использования такой конструкции:
DB::select() ->from(array('context_adv_theme', 't')) ->join(array('context_adv', 'a'), 'inner') ->on('t.id', '=', 'a.theme_id') ->where('fl', '=' ,1);
SELECT * FROM `test_context_adv_theme` AS `t` INNER JOIN `test_context_adv` AS `a` ON (`test_t`.id = `test_a`.theme_id) WHERE `fl` = 1
как видно в конструкции ON получалась такая запись (`test_t`.id = `test_a`.theme_id), вместо (`t`.id = `a`.theme_id)
для того, чтобы было (`t`.id = `a`.theme_id) необходимо ставить алиасы таблицы в конструкторе запроса ->ON в двойные кавычки, как это показано на нижнем примере:
DB::select() ->from(array('context_adv_theme', 't')) ->join(array('context_adv', 'a'), 'inner') ->on('"t".id', '=', '"a".theme_id') ->where('fl', '=' ,1);
SELECT * FROM `test_context_adv_theme` AS `t` INNER JOIN `test_context_adv` AS `a` ON (`t`.id = `a`.theme_id) WHERE `fl` = 1
В помощь тебе, юзер!!!
Статья просмотренна 41124 раз, зашло посетителей 14150
Объясните пользу использования этих не простых конструкций в пользу ручного написания запроса. Это требование фреймворка или есть реальная польза?
Конечно можно писать и в лоб, но так ты сам должен заботится об инъекциях, о названиях таблиц, например ты решил поставить префикс к таблице и тебе придется переписывать все запросы, а так меняется одна настройка и все в ажуре.
Я знаю зенд, кодеигнитер и кохану все они имеют конструкторы запросов.
Лучше всего использовать ОRM модель (Doctrine), там вообще запросы писать не надо, главное правильно настроить модель. Пока не использую, но хочу попробовать.
Ну хорошо, вот еще один аргумент. Как-то я писал сайтик который работал под MySQL, а часть кода работала под MsSQL. Я только перед запросом указывал какой адаптер использовать в данном случае, остальное — синтаксис под конкретную СУБД, конструктор создавал сам.
Хоть язык описания запросов считается одинаковым для всех СУБД, но каждая как-то немного отличается. Пример отличий
При использовании конструктора никаких проблем я не испытал.
А самую большую пользу от использования конструктора запросов и не написали — ведь объект, созданный конструктором запросов можно передавать в разные функции, в разные классы, т.е. достаточно экономно создавать разные запросы в разных ситуациях. Я например только что вообще сделал, что часть кода идёт через Kohana ORM, часть — через DB, но есть функции, которые добавляют выражения where и туда и туда. С чистым SQL такое вообзе невохможно
Спасибо за комментарий. Наверное каждый описывает, то с чем он работал и видать в моей практике такие решения как-то обходил. Есть желание написать об этом статью?
По моему опыту, префиксы и инъекции это единственное о чем нужно заботиться, решаю для себя это вполне просто. Поэтому мне не понятно использование дополнительных конструкций.