Комментарии (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 генерируется