Как стать автором
Обновить

RedBeanPHP — еще одна ORM библиотека

Время на прочтение3 мин
Количество просмотров32K
RedBeanPHP logo
На хабре нашел пару упоминаний про эту ORM, да и то давно и в комментариях. Недавно обнаружил, что вышла уже вторая версия. Желающим — вот ссылка на загрузку (GitHub) и на документацию
Цель этой статьи — кратко познакомить читателей с этой ORM-библиотекой.
RedBeanPHP — еще одна ORM-библиотека. Основное ее отличие от коллег, типа Propel или Doctrine, в отсутствии необходимости ручного конфигурирования объектов. Т.е. никаких xml, yml или ini-файлов. RedBenPHP на лету создает таблицы, поля и индексы. Любой объект можно связать с другим. Из БД поддерживаются MySQL, SQLite и Postgres.

ТТХ


Состоит библиотека из одного файла. Написана она под версию php 5.3, но по заявлению автора, должна работать и под 5.2. Для работы необходимо расширение PDO.

Основы работы


RedBeanPHP работает с bean'ами. Для начала вы можете просто создать bean. Это объект с публичными свойствами и типом. Тип bean'а используется для сопоставления таблице в БД и, опционально, для указания вашего класса. Bean создается таким образом:
$book = R::dispense( 'book' );

Теперь у нас есть пустой bean типа book. Зададим ему пару свойств:
$book->title = 'Boost development with RedBeanPHP';
$book->author = 'Charles Xavier';

И сохраним в БД:
$id = R::store($book);

Теперь все данные сохранены в БД. У нашего bena'а сейчас есть два свойства, в которые мы записали строковые данные, поэтому RedBeanPHP выбрал тип VARCHAR(255) для этих свойств. Если бы мы решили сохранить число в одном из свойств ($book->price = 100), то RedBeanPHP выбрал бы тип TINYINT(3) для хранения этого свойства. Если потом нам надо будет сохранить дробную цену, то RedBeanPHP на лету поменяет тип поля в БД.
Для загрузки из БД используется метод R::load()
$book = R::load('book', $id);
$books = R::batch('book',array($id1,$id2));

Удаление из БД делается так:
// одна запись
R::trash( $book );
// все записи
R::wipe( 'book' );


Поиск bean'ов


Для поиска используется метод R::find()
$needles = R::find('needle',' haystack = ?', array( $haystack ));

find() принимает три аргумента: тип bean'а, SQL-запрос и массив значений, которые будут подставлены вместо знаков вопросов во втором аргументе. Вместо знаков вопроса можно использовать именованные параметры:
$needles = R::find('needle',' haystack = :haystack
ORDER BY :sortorder',
array( 'sortorder'=>$sortorder, ':haystack'=>$haystack ));

В RedBeanPHP можно писать обычные SQL-запросы, создавать и использовать представления и тегировать сущности.

Связи в RedBeanPHP


Свойства объектов могут сами быть объектами. RedBeanPHP позволяет сохранять связанные объекты:
$farm = R::dispense('building');
$village = R::dispense('village');
$farm->name = 'farm';
$village->name = 'Dusty Mountains';
$farm->village = $village; //assign farm to village
$id = R::store($farm);

и загружать их
$farm = R::load('building',$id);
echo $farm->village->name; //prints 'Dusty Mountains'

Связывать можно и сразу несколько bean'ов:
list($mill,$tavern) = R::dispense('building',2);
$village->ownBuilding = array($mill,$tavern);

Если вы сохраните $village и снова загрузите из БД, то в свойстве ownBuilding обнаружите связанные bean'ы. Имя свойства должно совпадать с хранимыми в нём bean'ами. Для удаления связи используется unset(). Связанные bean'ы можно изменять прямо из родительского объекта:
$village->ownBuilding[1]->name = 'The Old Inn';

Для доступа к хранимым bean'ам в качестве ключа массива необходимо использовать ID хранимых в нем bean'ов.

Прочее


По умолчанию RedBeanPHP работает в свободном режиме, в котором схема БД меняется в зависимости от кода, который с ней работает. Этот режим отлично подходит для разработки. В это время вам не надо заботиться о БД. После окончания разработки нужно выполнить команду freeze().
R::freeze( true ); //will freeze redbeanphp

Эта команда отключит в RedBeanPHP проверку схемы данных, что увеличит скорость работы.
Еще, на мой взгляд, полезная вещь — это импорт bean'ов из массивов по ключам, например:
$book->import($_POST);
$book->import($_POST, 'title,subtitle,summary,price');

Но валидации при этом не происходит.

Почитать


Эта статья по сути — вольный перевод нескольких разделов мануала по RedBeanPHP.
В мануале еще раскрываются темы по организации связей много-ко-многих, деревьев, созданию моделей и валидации, написанию плагинов для RedBeanPHP и интеграции с фреймворками.
Теги:
Хабы:
Всего голосов 60: ↑55 и ↓5+50
Комментарии33

Публикации

Истории

Работа

PHP программист
147 вакансий

Ближайшие события