Давно я собирался написать этот пост, практически...

Давно я собирался написать этот пост, практически сразу после выхода цикла о создании игрового сайта, но как-то всё время откладывал. В новых версиях фреймворка Yii (1.1.х) немного изменился принцип использования встроенной библиотеки для работы с базой данных, точнее она стала по-другому формировать SQL запросы при использовании связанных таблиц. Речь идет об этом изменении.

По умолчанию для всех отношений, включенных в 'жадную' загрузку, будет сгенерировано и выполнено одно выражение с использованием JOIN. Если в основной таблице есть опции запроса LIMIT или OFFSET, то сначала будет выполнен этот запрос, а затем другой SQL-запрос, который возвращает все связанные объекты. Раньше, в версии 1.0.x, по умолчанию вызывалось N+1 SQL-запросов, если 'жадная' загрузка включала N отношений HAS_MANY или MANY_MANY. (перевод взят отсюда)

В моем примере с игровым сайтом как раз возникла такая ситуация. Есть две таблицы, с играми (ygs_games) и их жанрами (ygs_types). Отношение между таблицами многие-ко-многим. При этом необходимо выводить игры определённого жанра с разбивкой на страницы (пагинацией), т. е. использовать в запросе limit и offset. Yii позволяет сформировать запросы на получение этих данных двумя способами, которые называются: "жадная" загрузка и "ленивая" загрузка. Первый предполагает формирование одного запроса, в котором будут получены все необходимые данные. В этом запросе будут использованы объединения (JOINs). Во втором случае используется несколько запросов.

Давно я собирался написать этот пост, практически...

Сначала выбираются нужные записи из первой таблицы (первый запрос), затем – данные из связанной таблицы (для каждой записи из первой таблицы выполняется дополнительный запрос). Проблема, с которой я столкнулся. В старых версиях для этих целей можно было использовать следующий код.

Понравилась статья? Получай обновления и будь всегда в курсе событий!
Подпишись на RSS или
blog comments powered by Disqus