Библиотека RedBeanPHP для работы с Базами Данных

Опубликовано 5 февраля 2023 в 15:35 (Обновлено 13 ноября 2023 в 02:46)

Время чтения: 6 мин

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

RedBeanPHP
RedBeanPHP

Установка RedBeanPHP

Данная технология позволяет преобразовывать несовместимые типы моделей в Объектно-Ориентированном Программировании (ООП), в частности, между хранилищем данных и объектами программирования.

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

После скачивания файла, распакуйте его и поместите в ваш проект. Подключить библиотеку можно через функцию require:

require 'libs/rb.php';

Установка через Composer

Только для версий RedBeanPHP ниже 4.0.

Создать файл composer.json с таким содержимым:

{
  "require": {
    "gabordemooij/redbean": "dev-master"
  }
}

В консоли выполняем следующую команду:

composer install

Разрешаем подчеркивания

Очень много разработчиков сталкиваются с проблемой при использовании RedBeanPHP, когда PHP выдает ошибку:

Fatal error: Uncaught RedBeanPHP\RedException: Invalid type
Внимание! В RedBean нельзя по умолчанию использовать подчеркивания в названиях таблиц Баз Данных, т.е. в этой библиотеке подчеркивания нужны для обозначения отношений двух таблиц.

Но разрешить работу с таблицами, в названии которых есть нижнее подчеркивание все-таки можно, так как многие фреймворки и 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 по этой ссылке.

На официальном сайте есть следующее объяснение:

В RedBeanPHP символ подчеркивания '_' используется для обозначения отношения между двумя таблицами. Например, таблица book_tag используется для связывания книг с тегами.

Итак, если вы хотите использовать префиксы таблиц, такие как 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}.";

Этот код выведет:

Have you ever read 'Trees' (Trees and other poems) by Joyce Kilmer ? it's a beautiful poem about nature.

Подключение 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();

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.