Ответ
Да, основную часть работы с базами данных в 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).