Теги модуля SQL-запросов

ExpressionEngine содержит специальный тег, который позволяет вам выполнять SQL запросы и получать результаты их выполнения из вашей базы данных, без необходимости написания кода PHP. Основной синтаксис для тега:

{exp:query sql="SELECT screen_name FROM exp_members WHERE member_id = '1' "}

{screen_name}

{/exp:query}

Работа этого тега немного отличается от большинства других тегов, поэтому требуются дополнительные пояснения. Во-первых, вы можете использовать только оператор SELECT в запросе; он не обрабатывает запросы UPDATE или DELETE. Вы можете использовать любой стандартный запрос, который вам необходим, используя для этого стандартный синтаксис обычных SQL запросов.

Отбор полей и переменных

Каждая из колонок или полей, которые вы включили как часть вашего оператора SELECT, будет доступна в парном теге, как {переменная } с тем же именем, что и поле. Так, в примере, приведенном выше, поле "screen_name" было выбрано, таким образом переменная {screen_name} доступна внутри тега.

{exp:query sql="SELECT screen_name, email, location FROM exp_members WHERE group_id = '1'"}

{screen_name}
{email}
{location}

{/exp:query}

Этот запрос сделал бы доступными три переменные из таблицы "exp_members".

Вы можете выполнить запрос так, чтобы автоматически стали доступны все столбцы/поля, используя символ "*":

{exp:query sql="SELECT * FROM exp_members WHERE group_id = '1'"}

{username}
{screen_name}
{password}
{email}
{location}

{/exp:query}

Возврат нескольких строк

Если специально не указано, то ваш запрос возвращает только один результат, большинство запросов будут возвращать несколько "строк" результатов. Для того чтобы иметь дело с несколькими строками результатов, ExpressionEngine будет автоматически выполнять цикл через весь тег запроса, столько раз, сколько необходимо для вывода всех возвращенных строк данных. Допустим, что вы хотите вывести список всех пользователей одной из ваших групп. Для этого вы можете использовать следующий код:

{exp:query sql="SELECT screen_name FROM exp_members WHERE group_id = '6'"}

{screen_name}<br />

{/exp:query}

На вашей странице, вы получили бы следующие результат:

Michael Jordan
Wayne Gretzky
Joe Montana
Roger Clemens
David Beckham

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

Если нет никаких результатов

Вы можете использовать глобальную условную переменную {if no_results}, чтобы вывести ее содержимое, если ваш запрос не вернул никаких результатов. Например:

{exp:query sql="SELECT screen_name FROM exp_members WHERE group_id = '6'"}

{screen_name}<br />

{if no_results}
Sorry, no sports heroes here!
{/if}

{/exp:query}

Даты

Если вы выбираете даты из таблицы базы данных ExpressionEngine, то вы можете использовать форматирование и локализацию даты для пользователя. Как и с другими переменными даты, необходимо использовать параметр "format", чтобы определить формат отображения даты. Смотрите страницу изменяемое форматирование даты для получения дополнительной информации.

<p>Dates for the Last Five Entries:</p>

{exp:query sql="SELECT entry_date FROM exp_weblog_titles ORDER BY entry_date DESC LIMIT 5"}

<p>{entry_date format="%Y %m %d"}</p>

{/exp:query}

Разбивка на страницы

Разбивка на страницы в модуле SQL запросов работает точно так же, как разбивка на страницы записей и комментариев, только с одним исключением. В модули SQL запросов у вас не может быть оператора LIMIT в вашем запросе. Вместо него вы должны использовать параметр limit="", для указания количества результатов, выводимых на одной странице, и затем ExpressionEngine будет автоматически изменять ваш запрос, для получения нужных результатов.

{exp:query limit="5" sql="SELECT title,entry_date FROM exp_weblog_titles ORDER BY entry_date DESC"}

<p>{title} - {entry_date format="%Y %m %d"}</p>

{paginate}
<p>Page {current_page} of {total_pages} pages {pagination_links}</p>
{/paginate}

{/exp:query}

Все переменные и параметры, используемые при разбивке на страницы разделов и комментариев , также доступны и для модуля SQL запросов. Так, вы можете указать, где поместить ссылки разбивки на страницы, и какой тип ссылок отображать.

{exp:query limit="5" paginate="top" sql="SELECT title,entry_date FROM exp_weblog_titles ORDER BY entry_date DESC"}

<p>{title} - {entry_date format="%Y %m %d"}</p>

{paginate}

{if previous_page}
<a href="{auto_path}">Previous Page</a>  
{/if}

{if next_page}
<a href="{auto_path}">Next Page</a>
{/if}

{/paginate}

{/exp:query}

Параметр Backspace

Вы можете добавить дополнительный параметр, который позволяет выполнить "возврат":

{exp:query sql="SELECT screen_name FROM exp_members WHERE group_id = '6'" backspace="2"}

Этот параметр удаляет символы после последней итерации цикла. Например, если вы размещаете запятую между каждым именем пользователя, то вы должны получить следующее размещение:

Brett Bretterson, Max Goldman, John Gustafson,

Однако, возможно, вам не нужна запятая после последнего пункта. Добавляя параметр "backspace" вы можете удалить ее. Просто сосчитайте количество символов и пробелов в позиции, которую вы хотите удалить, и укажите это количество в теге. Запятая с пробелом содержат два символа, таким образом, вам необходимо использовать следующий параметр backspace:

{exp:query sql="SELECT screen_name FROM exp_members WHERE group_id = '6'" backspace="2"}{screen_name}, {/exp:query}

Этот код будет отображать результаты следующим образом:

Brett Bretterson, Max Goldman, John Gustafson

Специальные переменные

count

{count}

Подсчет "количества" текущих строк отображаемых записей. Если отображается пять строк, то для четвертой строки переменная {count} будет иметь значение "4".

Если одна из колонок базы данных имеет имя (или алиас) "count", то имя будет иметь приоритет над переменной {count}. Чтобы использовать обе переменные, вам необходимо указать другой алиас для поля. Например:

{exp:query sql="SELECT count AS census FROM my_table"}
{count} <!--This is the row count-->
{census} <!--This is the contents of the database field "count"-->
{/exp:query}

switch=

{switch="option_one|option_two|option_three"}

Эта переменная разрешает вам чередовать любое количество значений отображения записей. Первая запись будет использовать "option_one", вторая будет использовать "option_two", третья "option_one", и так далее.

Самое очевидное применение этой переменной, - чередование цветов. Это можно сделать следующим образом:

{exp:query sql="SELECT screen_name, email FROM exp_members WHERE group_id = '1'"}

<div class="{switch="one|two"}">

<h1>{screen_name}</h1>
{email}

</div>

{/exp:query}

Тогда записи будут чередоваться между <div class="one"> и <div class="two">.

Одновременно может использоваться несколько тегов {switch=}, и система будет корректно отслеживать каждый из них.

total_results

{total_results}

Общее количество результатов запроса.

Примечания

Наряду с универсальностью и гибкостью этого тега, иногда, может быть трудно построить запрос. База данных ExpressionEngine немного абстрагирована, что означает, что связанные данные не всегда охраняться вместе в одной и той же таблице. Например, данные для записей разделов хранятся в двух таблицах: заголовки и основные данные хранятся в одной таблице, а поля body находятся в другой, поэтому если бы вы захотели создать запрос, возвращающий данные, которые хранятся в разных таблицах, то вы должны использовать SQL JOINS и другой расширенный синтаксис. Для того чтобы полностью использовать преимущества этого тега, вы должны хорошо понимать SQL запросы.

Наверх страницы