Выполнение запросов к базе данных

На данный момент в JohnCMS доступны несколько вариантов выполнения запросов к базе данных.

PDO

Этот вариант многим известен и применяется ещё с JohnCMS 7.0. Давайте рассмотрим особенности использования этого варианта. Чтобы получить объект PDO нам достаточно написать следующий код:

$db = di(PDO::class);

Далее используя объект $db вы можете выполнять запросы к базе данных. Рассмотрим пример, который получает записи из таблицы users:

$db = di(PDO::class);
$req = $db->query('SELECT * FROM `users`');
while ($row = $req->fetch()) {
echo $row['name'] .'
';
}

Этот пример выведет список имен пользователей, которые есть в таблице users.

Обратите внимание При работе с этим вариантом вы должны самостоятельно заботиться о безопасности запросов.

Конструктор запросов (Query Builder)

В JohnCMS для работы с БД используется библиотека illuminate/database которая и предоставляет конструктор запросов и ORM. Рассмотрим несколько основных примеров чтобы понять особенности работы с библиотекой в JohnCMS.

Для выполнения запросов, сначала нам необходимо получить объект текущего подключения к БД:

$connection = \Illuminate\Database\Capsule\Manager::connection();

Далее давайте выполним тот же запрос, который выполняли в обычном PDO варианте выше.

$users = $connection->table('users')->get();
foreach ($users as $user) {
echo $user->name . '<br>';
}

Этот запрос так же как и в предыдущем варианте выведет список имен пользователей, которые есть в таблице users. Метод get возвращает объект Illuminate\Support\Collection c результатами, в котором каждый результат — это экземпляр PHP-класса StdClass. Вы можете получить значение каждого столбца, обращаясь к столбцу как к свойству объекта. Давайте рассмотрим вариант получения одной строки из таблицы.

$user = $connection->table('users')->where('name', 'admin')->first();
echo $user->name;

Этот запрос вернет пользователя, у которого поле name равно admin.

Рассмотрим вариант вывода записей из таблицы с разбивкой на страницы по 5 элементов:

$user = $connection->table('users')->paginate(5);
foreach ($user as $item) {
echo $item->name;
}
echo $user->render();

При вызове метода paginate будет автоматически установлены ограничения для запроса и построен запрос количества элементов в таблице по указанному вами запросу. Т.е. при таком вызове вам не нужно заботиться об указании limit для запроса и не нужно строить запрос на количество записей, конструктор запросов сделает это за вас. При вызове метода render из нашего объекта, будет отрисована постраничная навигация. URL адреса будут построены исходя из текущей страницы. Вам так же не нужно заботиться об их формировании. Шаблон вывода постраничной навигации расположен тут: themes/default/templates/system/app/model_paginator.phtml

Выборка только необходимых столбцов

Иногда вам может понадобиться выбрать только определенные столбцы из таблицы в базе данных. Сделать это можно так:

$user = $connection->table('users')->select(['name', 'id'])->get();
foreach ($user as $item) {
echo $item->id . ' - ' . $item->name;
}

Для выборки конкретных столбцов используется метод select(). Он принимает названия столбцов в виде массива или просто списком аргументов. Например: select('name', 'id')

Сортировка результата выборки

Часто есть необходимость отсортировать результат выборки по какому-либо столбцу.

$user = $connection->table('users')
->select('name', 'id')
->orderBy('id')
->orderByDesc('name')
->get();
foreach ($user as $item) {
echo $item->id . ' - ' . $item->name;
}

В этом примере результат будет отсортирован по id и name. Метод orderBy вторым аргументом принимает направление сортировки asc или desc. По умолчанию asc. Метод orderByDesc это то же самое, что и orderBy('id', 'desc') Как видно из примера, сортировать можно по нескольким колонкам. Указанный выше пример выполнит следующий запрос к базе данных:

select `name`, `id` from `users` order by `id` asc, `name` desc

Мы рассмотрели общий принцип построения запросов. Если вы хотите ознакомиться подробно с конструктором запросов, вы можете это сделать здесь или на русском: здесь Обратите внимание, что для выполнения запросов нужно использовать объект $connection, а не DB::. В остальном все возможности, которые описаны по ссылкам, будут работать и в JohnCMS.