Пишем на SQL без SQL: основы по RedBean PHP

Что такое ORM, в частности RedBean PHP и какие у неё требования?

RedBeanPHP был создан для значительного облегчения жизни программистов в процессе работы с базами данных. RedBeanPHP требует версию PHP >= 5.3.4. Под капотом используется драйвер PDO, поэтому защита от SQL- инъекций при правильном применении гарантированна. К поддерживаемым СУБД RedBeanPHP относятся MySQL, MariaDB, PostgreSQL, SQLite, CUBRID.

ORM это способ задания связи объектов и РСУБД. Всего есть 2 модели ORM-систем: Data Mapper и Active Record. Так вот RedBeanPHP это Data Mapper и каждый объект записи здесь называется бином. Эти бины можно воспринимать как самые обычные объекты, свойства которых представляют собой записи в Ваших таблицах. То есть одна запись это один бин, а его свойства это поля Вашей записи. Работать с бином можно точно также как с обычным массивом.

Как подключить RedBean PHP

Скачать библиотеку RedBeanPHP можно на официальном сайте.

Подключить библиотеку можно через функцию require:

require 'libs/rb.php';

Как подключиться к базе данных посредством RedBean PHP?

Для подключения к базе данных в RedBeanPHP есть статичный метод setup, который принимает 4 опциональных аргумента.
Опциональными они являются, потому что Вы можете никакой аргумент не задать и тогда RedBeanPHP создаст временную базу данных в формате SQLite в Вашей временной директории.
Вызывается метод setup для MySQL следующим образом:

R::setup( 'mysql:host=127.0.0.1;dbname=redbean','login', 'password' ); 

if ( !R::testConnection() )
{
		exit ('Нет соединения с базой данных');
}

Метод testConnection проверяет есть ли у нас фактическое подключение к базе.

Подробнее о подключении к базам данных можно прочесть в разделе Connection.

Как закрыть соединение с базой данных?

Закрыть соединение с базой данных Вы можете при помощи метода close. Вызывается он вот так:

R::close(); 

Как выполнить произвольный запрос к базе данных?

Какой в RedBeanPHP есть аналог функции mysqli_query? Этим аналогом является метод exec. У него всего 2 аргумента: sql и bindings.
Бинды (bindings) – это специальная техника подготовленных запросов, при помощи которых можно обезопасить себя от SQL-инъекций.
Также бинды увеличивают производительность при частых запросах. Вызывается метод exec следующим образом:

Пример #1

Вторым элементом мы передаем массив с данными, которые будут подставлены вместо знака ? (плэйсхолдер). В данном случае это id.

$id = $_POST['id'];
R::exec('DELETE FROM `users` WHERE `id` = ?', array(
    $id
));

Пример #2

Плэйсхолдеров может быть много. В этом случае в качестве первого знака ? будет вставлена первая ячейка массива, то есть цифра 32.
В качества второго ? слева на право будет вставлена цифра 51. В качестве последнего ? будет вставлена цифра 73.

R::exec('DELETE FROM `users` WHERE `id` = ? OR `id` = ? OR `id` = ?', array(
    32,
    51,
    73
));

Пример #3

Если Вы уже работали с PDO, то возможно будет привычней использовать следующий подход:

$id = $_POST['id'];
R::exec('DELETE FROM `users` WHERE `id` = :id', array(
    ':id' => $id
));

Пример #4

R::exec( 'UPDATE `page` SET `title`="test" WHERE `id` = 1' );

4 операции CRUD (Create, Read, Update, Delete)

1. Как создавать данные (Create)

Метод dispense принимает всего 1 аргумент – название таблицы. RedBeanPHP умеет создавать таблицы налету.
Достаточно вызвать dispense и указать какие поля будут у таблицы. После этого мы вызываем метод store и передаем в него бин user.

Пример #1

$user = R::dispense('users'); //передаем название таблицы users

//поле id можно не создавать, так как RedBeanPHP автоматически его создает с автоинкрементом
$user->login = $data['login'];
$user->email = $data['email'];

R::store($user); // сохраняем объект $user в таблице 

Пример #2

$user = R::dispense('users');

$user->name = 'Alex';
$user->age = 35;

R::store($user);

2. Как получать данные (Read/чтение)

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

$cat = R::load('category', 2);
echo $cat->title; // работаем с данными, как с объектом
echo $cat['title']; // работаем с данными, как с массивом

3. Как изменять данные (update)

Чтобы изменить запись в БД её нужно:
1 — получить в виде объекта;
2 – написать новое значение;
3 – сохранить через метод store.

$cat = R::load('category', 2);
$cat->title = "Новое значение"; 
R::store($cat);

echo $cat->title; // выводим наше новое значение

4. Как удалять данные/записи (delete)

Чтобы удалить запись из БД мы её должны:
1 — получить в виде объекта;
2 – использовать метод trash, который удалит одну запись. Есть ещё метод trashAll, который может удалить сразу несколько объектов.

$cat = R::load('category', 2);
R::trash($cat); //удаляем запись с id=2 из таблицы category

Как полностью очистить таблицу

R::wipe('category'); // удаляем все записи из таблицы category

Режим заморозки

Режим заморозки в RedBeanPHP нужен для того, чтобы включить или выключить поведение автоматического создания и изменения таблиц в БД. Сервер сильно нагружается, поэтому, когда Вы разрабатываете сайт,
то режим заморозки можно выключить (false).
Тогда автоматическое создание таблиц будет работать. Когда Вы зальете готовый сайт на хостинг, то нужно поставить режим заморозки в значение true.

R::setup(); // тут подключение к БД
R::freeze( true ); // тут выключение режима заморозки


Видеоучебник по RedBeanPHP

Статья была написана на основе видеоуроков Хауди Хо, который Вы можете посмотреть ниже.

Таймкоды:

2:00 Проверяем/Меняем версию PHP
6:10 Качаем/Подключаем RedBeanPHP
8:40 Подключаемся к базе данных R::setup()
9:50 В чём разница между utf8_general_ci и utf8mb4_general_ci
11:45 Почему нужно прописывать IP в качестве хоста базы данных

14:45 Закрытие соединения с базой данных R::close()
15:10 Проверяем соединение с базой данных R::testConnection()
16:00 Выполняем произвольный SQL код R::exec()
20:20 Что такое CRUD
21:00 Создание записей R::dispense()
27:50 О режиме заморозки R::freeze()

30:45 Конвенция именования таблиц
32:20 Пишем обход конвенций именования таблиц R::ext()
34:00 Конвенция именования свойств бина
34:40 Конвенция автосоздания индексов

37:20 Загружаем записи R::load()
41:00 Загружаем сразу несколько записей R::loadAll()
42:30 Поиск записей R::find()
44:20 Генерируем бинд слоты R::genSlots()
46:40 Ищем только одну запись R::findOne()
47:25 Загружаем все записи сразу R::findAll()
48:10 Итерация по всем записям R::findCollection()
49:40 Ищем записи по значениям R::findLike()
51:30 Загружаем запись если есть, создаем и загружаем если нет R::findOrCreate()
53:15 Считаем количество записей R::count()

54:35 Обновляем данные в записях
59:00 Удаляем записи из таблиц
1:00:18 Вайпаем данные таблиц (очищаем таблицы) R::wipe()


Таймкоды:

1:33 Почему нельзя копировать вообще весь код из урока
2:45 Метод R::getAll()
6:09 Метод R::getRow()
10:45 Метод R::getCol()
15:00 Методы R::convertToBean() и R::convertToBeans(), перекидываем массивы в бины
16:44 Метод R::getInsertID()

19:42 Что такое отношения вообще?
23:45 Отношения One-to-Many (1:M)
40:06 Отношения Many-to-One (M:1)
44:35 Отношения One-to-X (One-to-Fixed)
53:30 Отношения Many-to-Many (M2M)

57:40 Сортировка отношений
59:55 Фильтрация отношений
1:02:55 Добавляем отношения без их подгрузки
1:04:30 Подсчёт отношений/связей


Ещё один урок, но уже от другого человека.