ORM для PHP: сравнение Doctrine, Eloquent и Cycle — примеры кода

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

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

Начать курс

ORM для PHP: сравнение и примеры

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

1. Doctrine ORM — Data Mapper

Doctrine — самый мощный и зрелый ORM для PHP. Использует паттерн Data Mapper: сущности (Entity) не знают о базе данных, а вся работа с БД выполняется через репозитории и менеджер сущностей EntityManager.

// Пример сущности в Doctrine
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;

    public function getName(): string
    {
        return $this->name;
    }

    public function setName(string $name): void
    {
        $this->name = $name;
    }
}

// Сохранение и получение
$user = new User();
$user->setName('Алексей');
$entityManager->persist($user);
$entityManager->flush();

$users = $entityManager->getRepository(User::class)->findAll();

2. Eloquent ORM — Active Record

Eloquent — ORM из фреймворка Laravel. Использует паттерн Active Record: каждый объект сам знает, как сохранить себя в БД. Код компактный и интуитивный, идеален для быстрой разработки.

// Модель Eloquent
use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    protected $table = 'users';
    protected $fillable = ['name'];
}

// Создание записи
$user = User::create(['name' => 'Мария']);

// Чтение
$users = User::where('name', 'like', '%Ма%')->get();

foreach ($users as $user) {
    echo $user->name;
}

// Обновление
$user = User::find(1);
$user->name = 'Ольга';
$user->save();

3. Cycle ORM — гибридный подход

Cycle — современная ORM от авторов фреймворка Spiral. Сочетает лучшие черты Data Mapper и Active Record. Работает быстрее Doctrine за счёт кеширования схемы и отсутствия магии. Поддерживает строгую типизацию.

// Сущность Cycle
use Cycle\Annotated\Annotation as Cycle;

/**
 * @Cycle\Entity
 * @Cycle\Table(name="users")
 */
class User
{
    /** @Cycle\Column(type="primary") */
    public int $id;

    /** @Cycle\Column(type="string") */
    public string $name;
}

// Сохранение
$user = new User();
$user->name = 'Иван';
$orm->persist($user);
$orm->run();

// Поиск
$users = $orm->getRepository(User::class)->select()->fetchAll();

Сравнение ORM для PHP

Характеристика Doctrine Eloquent Cycle
Паттерн Data Mapper Active Record Гибрид
Производительность Средняя Высокая (с кешем) Высокая
Связь с фреймворком Независимый Laravel Spiral / независимый
Генерация миграций Встроенная Через Artisan Встроенная
Поддержка DTO Да (через Embeddable) Ограниченная Нативная
Сложность освоения Высокая Низкая Средняя

Какую ORM выбрать?

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