Doctrine — это мощный ORM (Object-Relational Mapper) для PHP, который реализует паттерн Data Mapper. В отличие от Active Record, он полностью отделяет бизнес-логику от работы с базой данных.
Ключевые особенности:
Пример сущности 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;
// Геттеры и сеттеры...
}
$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();
Пример сложного запроса:
$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();
Пример связи "многие-ко-многим":
#[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;
}
php bin/console make:migration
php bin/console doctrine:migrations:migrate
Doctrine поддерживает несколько уровней кэширования:
Doctrine предоставляет систему событий:
Пример использования:
#[ORM\Entity]
#[ORM\HasLifecycleCallbacks]
class Product
{
#[ORM\PrePersist]
public function setCreatedAtValue(): void
{
$this->createdAt = new \DateTimeImmutable();
}
}
Doctrine ORM — это реализация паттерна Data Mapper
Основные преимущества:
Ключевые особенности:
Когда использовать:
Для максимальной эффективности: