Что такое Doctrine ORM?php-79

1. Основная концепция Doctrine

Doctrine — это мощный ORM (Object-Relational Mapper) для PHP, который реализует паттерн Data Mapper. В отличие от Active Record, он полностью отделяет бизнес-логику от работы с базой данных.

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

  • Работа с БД как с коллекцией объектов
  • Поддержка различных СУБД (MySQL, PostgreSQL, SQLite и др.)
  • Кэширование запросов
  • Миграции базы данных
  • DQL (Doctrine Query Language)

2. Архитектура Doctrine

Основные компоненты:

  1. EntityManager - центральный интерфейс для работы с сущностями
  2. Repository - паттерн для доступа к данным
  3. Unit of Work - отслеживает изменения объектов
  4. DBAL (Database Abstraction Layer) - низкоуровневая работа с БД

3. Создание сущности

Пример сущности Product:

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;

#[ORM\Entity(repositoryClass: ProductRepository::class)]
class Product
{
    #[ORM\Id]
    #[ORM\GeneratedValue]
    #[ORM\Column]
    private ?int $id = null;

    #[ORM\Column(length: 255)]
    private string $name;

    #[ORM\Column(type: 'decimal', precision: 10, scale: 2)]
    private float $price;

    #[ORM\ManyToOne(targetEntity: Category::class, inversedBy: 'products')]
    private Category $category;

    // Геттеры и сеттеры...
}

4. Работа с EntityManager

Сохранение объекта:

$product = new Product();
$product->setName('Laptop');
$product->setPrice(999.99);

$entityManager->persist($product);
$entityManager->flush();

Получение объектов:

$product = $entityManager->find(Product::class, 1);
$products = $entityManager->getRepository(Product::class)->findAll();

5. DQL

Пример сложного запроса:

$query = $entityManager->createQuery(
    'SELECT p FROM App\Entity\Product p WHERE p.price > :price ORDER BY p.name ASC'
)->setParameter('price', 100);

$products = $query->getResult();

6. Связи между сущностями

Основные типы связей:

  1. ManyToOne / OneToMany
  2. ManyToMany
  3. OneToOne

Пример связи "многие-ко-многим":

#[ORM\Entity]
class User
{
    #[ORM\ManyToMany(targetEntity: Group::class, inversedBy: 'users')]
    private Collection $groups;
}

#[ORM\Entity]
class Group
{
    #[ORM\ManyToMany(targetEntity: User::class, mappedBy: 'groups')]
    private Collection $users;
}

7. Миграции базы данных

Генерация миграции:

php bin/console make:migration

Выполнение миграций:

php bin/console doctrine:migrations:migrate

8. Кэширование

Doctrine поддерживает несколько уровней кэширования:

  1. Query Cache - кэширование DQL-запросов
  2. Result Cache - кэширование результатов
  3. Metadata Cache - кэширование метаданных сущностей

9. События и хуки

Doctrine предоставляет систему событий:

  • prePersist/postPersist
  • preUpdate/postUpdate
  • preRemove/postRemove
  • loadClassMetadata

Пример использования:

#[ORM\Entity]
#[ORM\HasLifecycleCallbacks]
class Product
{
    #[ORM\PrePersist]
    public function setCreatedAtValue(): void
    {
        $this->createdAt = new \DateTimeImmutable();
    }
}

Резюмируем:

  1. Doctrine ORM — это реализация паттерна Data Mapper

  2. Основные преимущества:

    • Чистая архитектура (разделение модели и БД)
    • Мощная система запросов (DQL)
    • Гибкость в работе с разными СУБД
    • Автоматическая работа с отношениями
  3. Ключевые особенности:

    • Работа с объектами вместо SQL
    • Поддержка сложных связей между сущностями
    • Система миграций
    • Производительность за счет кэширования
  4. Когда использовать:

    • В сложных проектах с богатой предметной областью
    • Когда важна гибкость и масштабируемость
    • Для проектов, где возможна смена СУБД

Для максимальной эффективности:

  • Используйте репозитории для сложных запросов
  • Оптимизируйте запросы с помощью JOIN'ов в DQL
  • Применяйте кэширование в production-окружении
  • Регулярно обновляйте версию Doctrine для получения новых возможностей