Библиотека RedBeanPHP — является ORM (англ. — Object-Relational Mapping или объектно-реляционное отображение) технологией для взаимодействия с реляционной базой данных, сохранения объектов в нее и извлечения.

Установка RedBeanPHP
Данная технология позволяет преобразовывать несовместимые типы моделей в Объектно-Ориентированном Программировании (ООП), в частности, между хранилищем данных и объектами программирования.
Скачать библиотеку RedBeanPHP можно на официальном сайте. Библиотека состоит из одного файла.
После скачивания файла, распакуйте его и поместите в ваш проект. Подключить библиотеку можно через функцию require
:
require 'libs/rb.php';
Установка через Composer
Только для версий RedBeanPHP ниже 4.0.
Создать файл composer.json
с таким содержимым:
{
"require": {
"gabordemooij/redbean": "dev-master"
}
}
В консоли выполняем следующую команду:
composer install
Разрешаем подчеркивания
Очень много разработчиков сталкиваются с проблемой при использовании RedBeanPHP, когда PHP выдает ошибку:
Но разрешить работу с таблицами, в названии которых есть нижнее подчеркивание все-таки можно, так как многие фреймворки и CMS имеют в именах таблиц префиксы. Это касается, кстати и WordPress в которой для названий используется префикс wp_.
Изначально RedBean не понимает, вернее не разрешает использование _
подчеркиваний.
Как обойти эту проверку?
Для решения задачи нам нужно написать небольшой плагин (фрагмент кода):
R::ext('xdispense', function($table_name){
return R::getRedBean()->dispense($table_name);
});
И потом создаем таблицу через xdispense
:
$note = R::xdispense('lead_notes');
Решение найдено на stackoverflow.com и потом я нашел решение на официальном сайте RedBeanPHP по этой ссылке.
На официальном сайте есть следующее объяснение:
Итак, если вы хотите использовать префиксы таблиц, такие как cms_ или tbl_, вам придется обойти проверку политики схемы RedBeanPHP следующим образом:
R::ext('xdispense', function( $type ){
return R::getRedBean()->dispense( $type );
});
Теперь вы можете использовать подчеркивание в вашем типе (type) bean-компонента:
$page = R::xdispense( 'cms_page' );
Однако название типа все равно выглядит странно. Используя константу, вы можете улучшить читаемость этого кода:
define( 'PAGE', 'cms_page' );
$page = R::xdispense( PAGE );
Это также работает для отношений:
define( 'PAGES', 'ownCms_page' );
$pages = $site->{PAGES};
Вот полный пример:
//Define your mappings like this
define( 'POEM', 'tbl_poem' );
define( 'BOOK', 'tbl_book' );
define( 'AUTHOR', 'tbl_author' );
define( 'CATEGORY', 'tbl_category' );
define( 'POEMS', 'ownTblPoem' );
define( 'CATEGORIES', 'sharedTblCategory' );
//Create an extension to by-pass security check in R::dispense
R::ext('xdispense', function( $type ){
return R::getRedBean()->dispense( $type );
});
//Use tbl_book_category instead of tbl_book_tbl_category
R::renameAssociation([
'tbl_book_tbl_category' => 'tbl_book_category'
]);
//Use them like this:
$poem = R::xdispense( POEM );
$poem->title = 'Trees';
$author = R::xdispense( AUTHOR );
$author->name = 'Joyce Kilmer';
$book = R::xdispense( BOOK );
$book->title = 'Trees and other poems';
$category = R::xdispense( CATEGORY );
$category->name = 'nature';
$book->{AUTHOR} = $author;
$book->{POEMS}[] = $poem;
$book->{CATEGORIES}[] = $category;
$id = R::store( $book );
//For testing purposes let's output something:
$book = R::load( BOOK, $id );
$poem = reset( $book->{POEMS} );
$author = $book->{AUTHOR};
$category = reset( $book->{CATEGORIES} );
echo "Have you ever read '{$poem->title}' ({$book->title}) by {$author->name} ?
it's a beautiful poem about {$category->name}.";
Этот код выведет:
Подключение RedBeanPHP
В корне проекта создаем файл index.php
. В файле подключаем автозагрузчик компоузера (если использовали composer) autoload.php
, или скачанную библиотеку напрямую. Затем подключаемся к базе данных MySQL:
// Подключаем автозагрузчик composer
require_once __DIR__.'/vendor/autoload.php';
// Или: require "libs/rb.php";
// Создаём псевдоним для указанного класса
class_alias('\RedBeanPHP\R', '\R');
/**
* Подключаемся к базе данных
* Последний (4-й) параметр по умолчанию выставлен в FALSE
* Если нужно применить заморозку таблиц в БД (отменить создание на лету),
* то нужно данный параметр выставить в TRUE
* или так: R::freeze(true);
*/
R::setup( 'mysql:host=localhost;dbname=redbeanphp','root', '', false);
// Проверка подключения к БД
if(!R::testConnection()) die('No DB connection!');
/**
* Если нужно работать с таблицами, в названии которых
* присутствует знак подчёркивания (_), то необходимо воспользоваться
* таким методом
*/
R::ext('xdispense', function( $type ){
return R::getRedBean()->dispense( $type );
});
// Использовать так:
$test = R::xdispense('test_table');
// Code...
R::store($test);
Чтобы не работать с алиасами секции use .. as ..
в каждом контроллере:
use RedBean_Facade as R;
Используем функцию class_alias
:
class_alias('RedBean_Facade', 'R');
Создание таблицы и записей
В RedBeanPHP есть уникальная способность создавать таблицы на лету и заносить в них данные:
// Создаем таблицу users
$user = R::dispense('users');
// добавляем в таблицу необходимые записи
$user->login = $data['login'];
$user->email = $data['email'];
$user->name = $data['name'];
$user->family = $data['family'];
// Сохраняем таблицу
R::store($user);
Или еще пример:
// Указываем, что будем работать с таблицей book
$book = R::dispense('book');
// Заполняем объект свойствами
$book->title = 'Призрак победы';
$book->price = 199;
// Можно обращаться как к массиву
$book['author'] = 'Макс Глебов';
// Сохраняем объект
R::store($book);
Чтение данных
Если нужно получить данные без каких-либо условий, то легче это сделать методами load() и loadAll(). Пример:
// Получаем все записи, ID которых указаны в массиве ids
$ids = [1,2,3];
$books = R::loadAll('book', $ids);
foreach ($books as $book){
echo $book->title.'<br/>';
}
// Получаем одну запись по её ID
$id = 1;
$books = R::load('books', $id);
echo $books->title;
Если по каким-то причинам вам понадобится именно массив данных, то на этот случай есть метод export()
:
$id = 1;
$book = R::load('book', $id);
$book = $book->export();
echo $book['title'];
Обновление записи
$id = 1;
// Загружаем объект с ID = 1
$book = R::load('book', $id);
// Обращаемся к свойству объекта и назначаем ему новое значение
$book->price = 210;
// Сохраняем объект
R::store($book);
Удаление записей с помощью RedBeanPHP
Данные мы уже считали, обновили, и теперь посмотрим как с помощью RedBeanPHP можно данные удалять. Процесс не сложный. Удалим запись с ID = 5
:
$id = 5;
$book = R::load('book', $id);
R::trash($book);
Удалить записи с ID = 6,7
:
$ids = [6, 7];
$book = R::loadAll('book', $ids);
R::trashAll($book);
// Начиная с версии 5.1 данную задачу лучше выполнить методом R::trashBatch(). В таком случае нет необходимости создавать (получать) бин - объект RedBeanPHP
$ids = [6, 7];
R::trashBatch('book', $ids);
// Удаление записи с ID = 3
$id = 3;
R::hunt('book', 'id = ?', [$id]);
Метод R::wipe()
полностью очищает указанную таблицу:
R::wipe('book');
Метод R::nuke()
полностью очищает всю базу данных. Режим заморозки должен быть выключен:
R::freeze(false);
R::nuke();