ORM для PHP: сравнение Doctrine, Eloquent, Propel и RedBeanPHP

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

ORM для PHP: обзор и сравнение популярных библиотек

ORM (Object-Relational Mapping) — это технология, которая позволяет работать с базами данных через объекты языка программирования, а не через SQL-запросы. В PHP существует несколько мощных ORM-библиотек, каждая из которых имеет свои особенности, преимущества и недостатки. В этой статье мы подробно сравним четыре наиболее популярных решения: Doctrine, Eloquent, Propel и RedBeanPHP. Вы узнаете, как они устроены, увидите примеры кода и сможете сделать осознанный выбор для своего проекта.

1. Doctrine — полный контроль и мощный DQL

Doctrine — это самый зрелый и функционально насыщенный ORM для PHP. Он состоит из двух компонентов: DBAL (Database Abstraction Layer) и ORM (Object-Relational Mapping). Doctrine использует паттерн Data Mapper, что означает полное разделение бизнес-логики и логики хранения данных.

Ключевые особенности:

  • Полная поддержка Doctrine Query Language (DQL) — объектно-ориентированного SQL
  • Гибкая система миграций (Doctrine Migrations)
  • Ленивая и активная загрузка связей (Lazy/Eager Loading)
  • Поддержка событийного жизненного цикла сущностей
  • Встроенный кэш (метаданных, запросов, результатов)

Пример кода:

<?php
// Определение сущности (Entity)
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\Table(name="users")
 */
class User
{
    /** @ORM\Id @ORM\Column(type="integer") @ORM\GeneratedValue */
    private int $id;

    /** @ORM\Column(type="string", length=100) */
    private string $name;

    /** @ORM\Column(type="string", unique=true) */
    private string $email;

    // Геттеры и сеттеры
    public function getName(): string { return $this->name; }
    public function setName(string $name): void { $this->name = $name; }
    public function getEmail(): string { return $this->email; }
    public function setEmail(string $email): void { $this->email = $email; }
}

// Использование
$entityManager = EntityManager::create($connectionParams, $config);
$user = new User();
$user->setName('Иван Петров');
$user->setEmail('ivan@example.com');
$entityManager->persist($user);
$entityManager->flush();

// Запрос через DQL
$query = $entityManager->createQuery('SELECT u FROM App\Entity\User u WHERE u.email = :email');
$query->setParameter('email', 'ivan@example.com');
$result = $query->getOneOrNullResult();

2. Eloquent — простота и элегантность (Laravel)

Eloquent — это ORM, входящий в состав фреймворка Laravel, но доступный и для использования отдельно через пакет illuminate/database. Он использует паттерн Active Record, где каждая модель представляет собой строку в таблице БД. Eloquent славится своим интуитивным синтаксисом и автоматическим управлением связями.

Ключевые особенности:

  • Минимальная конфигурация — соглашения вместо конфигурации
  • Мощные отношения: belongsTo, hasMany, belongsToMany и др.
  • Автоматическое управление временными метками (created_at, updated_at)
  • Встроенные скоупы, мутаторы и аксессоры
  • Поддержка коллекций и пагинации

Пример кода:

<?php
use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    protected $table = 'users';
    protected $fillable = ['name', 'email'];
    protected $hidden = ['password'];

    // Отношение "один ко многим"
    public function posts()
    {
        return $this->hasMany(Post::class);
    }
}

// Создание записи
$user = User::create([
    'name' => 'Анна Смирнова',
    'email' => 'anna@example.com',
]);

// Запрос с условиями
$activeUsers = User::where('status', 'active')
    ->orderBy('created_at', 'desc')
    ->take(10)
    ->get();

// Загрузка связанных данных
$userWithPosts = User::with('posts')->find(1);
foreach ($userWithPosts->posts as $post) {
    echo $post->title;
}

3. Propel — генерация кода и высокая производительность

Propel — это ORM с генерацией классов на основе схемы базы данных (XML или YAML). Он следует паттерну Active Record, но с акцентом на производительность и строгую типизацию. Propel генерирует PHP-классы, которые напрямую соответствуют таблицам БД, включая все методы для работы с записями.

Ключевые особенности:

  • Генерация классов

Рекомендаций