Загрузка...

SQL-запросы Eloquent ORM

laravel cover

Eloquent ORM — это объектно-ориентированный слой для работы с базой данных в Laravel. Он позволяет описывать SQL-запросы с помощью интуитивного и чистого синтаксиса, что делает код читаемым и легко поддерживаемым, при этом автоматически защищает от SQL-инъекций. ([Medium][1])


📌 Основные возможности Eloquent

  • Запросы на чтение, фильтрация, сортировка и пагинация.
  • Создание, обновление и удаление записей.
  • Отношения между моделями (hasOne, hasMany, belongsTo, belongsToMany) с автоматической подгрузкой связанных записей.
  • Агрегатные функции (например, count, max, sum).

🧠 Примеры SQL-запросов через Eloquent

🔍 Получение данных (SELECT)

User::get();        // SELECT * FROM users
User::first();      // SELECT * FROM users LIMIT 1
User::find(2);      // SELECT * FROM users WHERE id = 2 LIMIT 1
User::paginate();   // SELECT ... LIMIT & OFFSET для пагинации

При использовании soft deletes записи с deleted_at автоматически исключаются из выборки, если не указано иначе.


🔎 Фильтрация (WHERE)

User::where('age', '>', 32)->get();                     // age > 32
User::whereIn('role', ['admin','editor'])->get();       // role IN (...)
User::whereBetween('age',[20,40])->get();               // BETWEEN
User::whereDate('created_at', now())->get();            // DATE(...)

Методы orWhere, whereNull, whereHas позволяют строить более сложные условия.


➕ Создание (INSERT)

User::create([
    'name' => 'Alex',
    'email' => 'alex@example.com',
]);

// Создаёт новую запись с автоматическим заполнением created_at/updated_at

Также можно использовать firstOrCreate() — он сначала ищет существующую запись, и только если её нет, создаёт новую.


✏️ Обновление (UPDATE) и удаление (DELETE)

User::where('status','inactive')->update(['active'=>false]);

$user->delete();       // DELETE
User::destroy(1,2,3);  // Удаление по ID

Для soft deletes метод delete() просто помечает запись, не удаляя её физически.


🔗 Отношения между моделями

👤 One-to-One

$user->profile;         // Получить профиль пользователя
User::with('profile');  // Загрузить пользователя + профиль

📦 One-to-Many

$user->orders;          // Все заказы пользователя
User::with('orders');   // Загрузить пользователей с их заказами

🔄 Many-to-Many

$user->roles;           // Роли пользователя через pivot таблицу
User::with('roles');    // Получить пользователей с ролями

Eloquent сам формирует соответствующие SQL-JOIN запросы.


📊 Агрегатные функции

User::count();          // SELECT COUNT(*) AS aggregate …
User::max('age');       // SELECT MAX(age) …
User::withCount('posts')->get();  // Кол-во связанных записей

Это упрощает получение статистики без ручного написания SQL.


💡 Советы и лучшие практики

Используйте ORM, когда это удобно

Eloquent отлично подходит для стандартных операций CRUD и отношений, делая код чище и понятнее.

Но помните про производительность

Для очень сложных запросов или больших объёмов данных ORM может уступать производительности «сырым» SQL-запросам или Query Builder, особенно если надо использовать специфичные SQL-функции, сложные подзапросы или аналитические конструкции.

Если столкнулись с узкими местами, можно использовать:

$users = DB::select('SELECT * FROM users WHERE ...');

— прямой SQL (через фасад DB), обходящий ORM, но требующий аккуратного использования параметров для безопасности.


📍 Вывод

🎯 Eloquent ORM — мощный и удобный инструмент для большинства запросов в Laravel. Он позволяет писать выразительный код, легко поддерживать его и безопасно взаимодействовать с базой данных.

⚡ При необходимости оптимизации или очень сложных запросов вы всегда можете комбинировать его с Query Builder или прямым SQL — главное, сохранять читаемость и безопасность кода.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *