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 выбрать?