← Назад к вопросам

Что делает ORM?

1.0 Junior🔥 241 комментариев
#Фреймворки

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

ORM (Object-Relational Mapping) — Объектно-Реляционное Преобразование

ORM — это техника программирования, которая позволяет взаимодействовать с базой данных через объекты и классы вместо написания SQL запросов. ORM автоматически преобразует (маппирует) данные между объектами в коде и таблицами в БД.

Основная идея

// ❌ Без ORM — прямой SQL
$pdo = new PDO("mysql:host=localhost;dbname=myapp", "user", "pass");
$stmt = $pdo->prepare("SELECT * FROM users WHERE id = ?");
$stmt->execute([$userId]);
$result = $stmt->fetch(PDO::FETCH_ASSOC);

$user = [
    "id" => $result["id"],
    "name" => $result["name"],
    "email" => $result["email"],
];

// ✅ С ORM (например, Eloquent или Doctrine)
$user = User::find($userId);
echo $user->name;
echo $user->email;

Что делает ORM

  • Автоматический маппинг — таблицы БД → классы, строки → объекты, колонки → свойства
  • Генерация SQL — ORM сама пишет запросы, ты пишешь код на PHP
  • Связи между таблицами — управление внешними ключами, отношениями один-ко-многим
  • Кэширование — оптимизация повторных запросов одних и тех же объектов
  • Валидация — проверка данных перед сохранением в БД
  • Миграции — версионирование схемы БД через код

Популярные ORM в PHP

// 1. Eloquent (Laravel) — простая и интуитивная
$user = User::find($id);
$user->email = "new@example.com";
$user->save();

// 2. Doctrine — мощная, для сложных приложений
$user = $entityManager->find(User::class, $id);
$user->setEmail("new@example.com");
$entityManager->persist($user);
$entityManager->flush();

// 3. Propel — альтернатива Doctrine
$user = UserQuery::create()->findPk($id);
$user->setEmail("new@example.com");
$user->save();

Примеры работы с ORM

// Определение модели
class User {
    protected $table = "users";
    protected $fillable = ["name", "email", "password"];
}

// Создание записи
$user = User::create([
    "name" => "John Doe",
    "email" => "john@example.com",
    "password" => bcrypt("secret"),
]);

// Чтение записи
$user = User::find($id);
$user = User::where("email", "john@example.com")->first();

// Обновление записи
$user->update(["email" => "newemail@example.com"]);

// Удаление записи
$user->delete();
User::destroy($id);

// Запросы с условиями
$users = User::where("age", ">", 18)
    ->where("status", "active")
    ->orderBy("name")
    ->limit(10)
    ->get();

Отношения в ORM

// Один ко многим (One-to-Many)
class User {
    public function posts() {
        return $this->hasMany(Post::class);
    }
}

$user = User::find(1);
$userPosts = $user->posts; // Автоматический SQL джойн

// Много ко многим (Many-to-Many)
class User {
    public function roles() {
        return $this->belongsToMany(Role::class);
    }
}

$user = User::find(1);
$userRoles = $user->roles; // Автоматический запрос с pivot таблицей

Преимущества ORM

  • Меньше кода — не пишешь повторяющиеся SQL запросы
  • Безопасность — автоматическая защита от SQL-инъекций
  • Типизация — лучше IDE автокомплит и типы
  • Переносимость — меняешь БД (MySQL → PostgreSQL) — код работает
  • Тестируемость — легче мокировать БД в тестах

Недостатки ORM

  • Производительность — иногда медленнее сырого SQL (N+1 проблема)
  • Сложность — для сложных запросов нужно знать ORM хорошо
  • Переусложнение — для простых CRUD операций может быть оверкилл
  • Debug — сложнее отследить какой SQL генерируется