Pull to refresh

PHP MongoDB ORM

Reading time 2 min
Views 12K
php+mongo
MongoDB — документо-ориентированная система управления базами данных хранящая данные в виде наборов JSON-подобных документов. Для работы с MondoDB в PHP используется pecl расширение mongo, позволяющее полноценно работать с СУБД используя объекты доступа.
В статье пойдет речь об ORM (Object-relational mapping) standalone библиотеках и фреймворках позволяющих упростить использование Mongo в PHP проектах и предоставляющих интерфейс к работе с данными.

Я решил не описывать работу с Mongo в CMS и фреймворках (таких как ZendFramework, Symfony, Drupal и др), потому что их настройка задача специфическая только для разработчиков использующих эти фреймворки, а цель статьи осветить универсальные средства.

Весь список библиотек и фреймворков есть на сайте MondoDB, я остановлюсь на следующих трех, обладающих наиболее широким функционалом:
  1. Doctrine ORM
  2. Mandango
  3. MongoRecord

Doctrine ORM

MongoDB Object Document Mapper все еще на стадии beta, но уже довольно функциональный, позволяет используя привычные для Doctrine методы (аннотации, XML или YAML) маппить PHP объекты в документы Mongo. Предоставляет удобный интерфейс для использования индексов, конструктор запросов, MapReduce. Сопровождается довольно обильной документацией.
Большим плюсом является возможность использования аннотаций для маппинга:
/** @Document */
class User
{
    // ...

    /** @Field(type="string") */
    private $username;
}


Mandango

Довольно молодой ODM (Object Document Mapper), упор в котором делается на высокую производительность и расширяемость. Судя по сравнениях скорости работы Doctrine и Mandango (на сайте Mandango), последний в среднем работает в 4 раза быстрей, предоставляя почти аналогичный пакет возможностей.
Кроме того имеет встроенный менеджер событий и умеет хранить файлы в GridFS используя расширение MongoGridFS. Документация довольно хороша.
Маппинг задается в конфигурации при помощи массивов:
array(
    'Model\Article' => array(
        'fields' => array(
            // as string
            'title' => 'string',
            // as array
            'content' => array('type' => 'string'),
        ),
    ),
);


MongoRecord

Простая библиотека состоящая из 4 классов, позволяющая наследуя базовый класс, добавлять своим классам функции для работы с СУБД. Не предоставляет возможности маппинга, конструктора запросов и других дополнительных функций. Просто и сердито.

Вывод

Да, выбор не велик. Для проекта которому нужен ORM с широкой функциональностью подойдет либо Doctrine, либо Mandango. Последний действительно довольно быстр, так как заточен именно под Mongo и кроме как работы с ней не умеет ничего, но с этой задачей справляется неплохо. Остальные библиотеки или умерли не родившись, или предоставляют только интерфейс для работы со стандартными PHP классами.

P.S. Если знаете достойный ORM framework не освещенный в статье, пишите в комменты или личку, буду дописывать. Потому что русскоязычной информации довольно мало, будем вместе заполнять этот пробел.
Tags:
Hubs:
+12
Comments 15
Comments Comments 15

Articles