Работали ли вы с базами данных через ORM в PHP?

«Работали ли вы с базами данных через ORM в PHP?» — вопрос из категории Базы данных, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, основную часть работы с базами данных в PHP я выполнял через ORM. Чаще всего это был Eloquent ORM в Laravel и Doctrine ORM в Symfony.

Пример работы с Eloquent (Laravel):

// Определение модели с отношениями
class Post extends Model
{
    protected $casts = ['published_at' => 'datetime'];

    public function author() {
        return $this->belongsTo(User::class);
    }

    public function scopePublished($query) {
        return $query->whereNotNull('published_at');
    }
}

// Использование: создание, запросы, отношения
$newPost = Post::create([
    'title' => 'My Article',
    'body' => 'Content here',
    'author_id' => Auth::id(),
]);

$recentPosts = Post::with('author') // Жадная загрузка
    ->published() // Использование scope
    ->orderBy('published_at', 'desc')
    ->take(10)
    ->get();

foreach ($recentPosts as $post) {
    echo $post->author->name; // Доступ к связанным данным
}

Пример работы с Doctrine (Symfony):

// Entity-класс с аннотациями (или атрибутами в PHP 8+)
/**
 * @ORMEntity
 * @ORMTable(name="products")
 */
class Product
{
    /**
     * @ORMId
     * @ORMGeneratedValue
     * @ORMColumn(type="integer")
     */
    private $id;

    /** @ORMColumn(type="string", length=255) */
    private $name;

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

// Работа в сервисе
$product = new Product();
$product->setName('Laptop');

$this->entityManager->persist($product); // Отслеживание сущности
$this->entityManager->flush(); // Запись в БД

// DQL (Doctrine Query Language) для сложных запросов
$query = $this->entityManager->createQuery(
    'SELECT p FROM AppEntityProduct p WHERE p.price > :price'
)->setParameter('price', 1000);
$products = $query->getResult();

Выводы из практики:

  • Плюсы ORM: Быстрая разработка, безопасность (защита от SQL-инъекций через подготовленные выражения), удобная работа со связями, миграции.
  • Минусы и обходные пути: Сложные аналитические запросы или операции с большими объемами данных часто пишу на нативном SQL (через DB::raw() в Laravel или NativeQuery в Doctrine) для максимальной производительности. Важно понимать, какие запросы генерирует ORM, используя ее инструменты для отладки (например, ->toSql() в Laravel или профилирование Doctrine).