5. Построение SQL-запросов

Просмотров: 16744Комментарии: 0
Лекции

Для большинства задач MaxSite CMS предлагает уже готовые решения. Но иной раз встречаются задачи, которые требуют своих особых выборок из базы данных. Например в шаблоне вывести заголовки каких-то определенных записей; или при создании виджета под свою задачу.

Данные задачи решаются с помощью SQL. То есть вы создаете SQL-запрос, выполняете его, а полученные данные выводите в нужном виде.

Для работы с базой данных MaxSite CMS использует возможности CodeIgniter. С его помощью работа с БД значительно облегчается.

Одним из важных инструментов является т.н. Active Record. Особенностью Active Record является то, что SQL-запрос формируется пошагово. Давайте рассмотрим несколько примеров.

Предположим нам нужно получить все записи из таблицы «page» с полями «page_title» и «page_id».

$CI->db->select('page_title, page_id');
$query = $CI->db->get('page');

Данный код сформирует и выполнит такой SQL-запрос:

SELECT page_title, page_id FROM mso_page

Для начала отметим две достопримечательности Active Record. Первая - автоматически формируются имена таблиц с учетом префикса («mso_»). Вторая - автоматическое экранирование запросов на предмет уязвимостей и прочих нехороших вещей.

Функция $CI->db->get осуществляет саму выборку. Обратите внимание на переменную $CI. Эта переменная служит для доступа к «главному» классу CodeIgniter. Впрочем, если строго, то это может быть и любая другая переменная, но в MaxSite CMS я стараюсь придерживаться именно такого именования.

Я хочу привести полный рабочий пример, с тем чтобы вам стало понятно о чем идет речь. Комментирование я ставлю прямо в код - так будет легче разобраться.

$CI = & get_instance(); // вот здесь мы и получаем доступ к CodeIgniter
 
// формируем наш SQL
$CI->db->select('page_id, page_title'); // SELECT page_id, page_title
 
$CI->db->where('page_status', 'publish'); // WHERE 'page_status'='publish'
 
$CI->db->where('page_date_publish<', date('Y-m-d H:i:s')); // AND 'page_date_publish'<'дата'
 
$CI->db->order_by('page_date_publish', 'desc'); // ORDER BY page_date_publish DESC
 
$CI->db->limit('5'); // последние 5 записей
 
$query = $CI->db->get('page'); // FROM mso_page + выполнение запроса
// В итоге у нас вот такой SQL сформировался
//    SELECT page_id, page_title 
//    WHERE 'page_status'='publish' AND 'page_date_publish'<'дата'
//    FROM mso_page
//    ORDER BY page_date_publish DESC
//    LIMIT 5
 
 
// проверяем сколько получено записей
if ($query->num_rows() > 0) // больше нуля, можно работать
{    
    $out = '';
    foreach ($query->result_array() as $page) // обходим в цикле
    {
        // формируем вывод - просто пример
        $out .= '<p>' . $page['page_id'] . ': ' . $page['page_title'] . '</p>';
    }
    echo $out; // выводим
}

Как вы уже поняли, этим кодом мы получаем последние пять опубликованных страниц. Главное удобство Active Record в том, что при формировании SQL можно указывать какие-то изменяемые параметры, например если вынести в админ-панель количество записей, то мы в $CI->db->limit пишем полученное значение. Другие же части SQL для нас не меняются.

Если вы смотрели код MaxSite CMS, то видели подобный подход множество раз.

Конечно же для более сложных выборок потребуются другие функции и в CodeIgniter они предусмотрены. Все их здесь нет смысла приводить, поэтому я лишь дам ссылку на русскую и английскую документацию.

За всё время работы с MaxSite CMS мне буквально пару раз пришлось формировать SQL вручную. Думаю, что у вас задачи если и будут то не сложней моих. ;)

О проекте

MaxSite CMS предназначена для создания сайтов любой сложности. Система отлично подходит обычным пользователям, вебмастерам, фрилансерам и вебстудиям.