Выполнение запросов к БД

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

1. 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'] .'<br>';
}
Этот пример выведет список имен пользователей, которые есть в таблице users.
Обратите внимание
При работе с этим вариантом вы должны самостоятельно заботиться о безопасности запросов.

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

Для выполнения запросов, сначала нам необходимо получить объект текущего подключения к БД:
$connect = Illuminate\Database\Capsule\Manager::connection();

Далее давайте выполним тот же запрос, который выполняли в обычном PDO.
$users = $connect->table('users')->get();
foreach ($users as $user) {
    echo $user->name . '<br>';
}
Этот запрос так же как и в предыдущем варианте выведет список имен пользователей, которые есть в таблице users. 
Метод get возвращает объект Illuminate\Support\Collection c результатами, в котором каждый результат — это экземпляр PHP-класса StdClass. Вы можете получить значение каждого столбца, обращаясь к столбцу как к свойству объекта.

Давайте рассмотрим вариант получения одной строки из таблицы.
$user = $connect->table('users')->where('name', 'admin')->first();
echo $user->name;
Этот запрос вернет пользователя, у которого поле name равно admin.

Рассмотрим вариант вывода записей из таблицы с разбивкой на страницы по 5 элементов:
$user = $connect->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

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

3. ORM
Работа с ORM более подробно будет описана в отдельном разделе.