Встроенные возможности работы с базой данных в Laravel

✅ 1. Подключение к базе данных

Laravel поддерживает множество баз данных: MySQL, PostgreSQL, SQLite, SQL Server. Настройки находятся в .env:

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=your_db
DB_USERNAME=root
DB_PASSWORD=secret
Конфигурация по умолчанию берётся из config/database.php, но менять нужно обычно .env.

✅ 2. Миграции — управление схемой базы данных

Миграции позволяют версионировать структуру базы, писать её в коде и легко распространять изменения. Создание миграции:

php artisan make:migration create_users_table
Пример миграции:

public function up()
{
  Schema::create('users', function (Blueprint $table) {
    $table->id();
    $table->string('name');
    $table->string('email')->unique();
    $table->timestamp('email_verified_at')->nullable();
    $table->string('password');
    $table->rememberToken();
    $table->timestamps();
  });
}

public function down()
{
  Schema::dropIfExists('users');
}
Запуск миграций:

php artisan migrate

✅ 3. Сидеры — наполнение базы тестовыми данными

Для наполнения таблиц данными удобно использовать сидеры. Создание сидера:

php artisan make:seeder UsersTableSeeder
Пример сидера:

public function run()
{
  \App\Models\User::factory(10)->create();
}
Запуск сидеров:

php artisan db:seed --class=UsersTableSeeder

✅ 4. Query Builder — удобный конструктор запросов

Query Builder позволяет писать запросы к БД без SQL, используя цепочки методов. Примеры:

//✔️Получение данных из базы

// Получить всех пользователей
$users = DB::table('users')->get();

// Получить одного пользователя
$user = DB::table('users')->where('id', 5)->first();

// Получить значение одного столбца
$name = DB::table('users')->where('id', 5)->value('name');

// Получить массив значений
$names = DB::table('users')->pluck('name');

// Получить массив пар [id => name]
$pairs = DB::table('users')->pluck('name', 'id');

// Пагинация
$users = DB::table('users')->paginate(15);


//✔️Фильтрация и условия

// Простое where
$users = DB::table('users')->where('active', 1)->get();

// Несколько условий
$users = DB::table('users')
  ->where('role', 'admin')
  ->where('active', 1)
  ->get();

// orWhere
$users = DB::table('users')
  ->where('role', 'admin')
  ->orWhere('role', 'moderator')
  ->get();

// whereIn
$users = DB::table('users')
  ->whereIn('id', [1, 2, 3])
  ->get();

// whereBetween
$users = DB::table('users')
  ->whereBetween('age', [18, 30])
  ->get();

// whereNull / whereNotNull
DB::table('users')->whereNull('email_verified_at')->get();


//✔️Сортировка, лимит, оффсет

// Сортировка
DB::table('users')->orderBy('created_at', 'desc')->get();

// Лимит и оффсет
DB::table('users')->limit(10)->offset(20)->get();


//✔️Агрегации

// Количество
$count = DB::table('users')->count();

// Минимум / максимум
$min = DB::table('orders')->min('total');
$max = DB::table('orders')->max('total');

// Сумма
$sum = DB::table('orders')->sum('total');

// Среднее
$avg = DB::table('orders')->avg('total');


//✔️Вставка данных

// Вставка одной записи
DB::table('users')->insert([
  'name' => 'John',
  'email' => 'john@example.com',
  'password' => bcrypt('secret'),
]);

// Вставка нескольких записей
DB::table('users')->insert([
  ['name' => 'Alice', 'email' => 'alice@example.com'],
  ['name' => 'Bob', 'email' => 'bob@example.com'],
]);

// Вставка и получение ID
$id = DB::table('users')->insertGetId([
  'name' => 'Sam',
  'email' => 'sam@example.com',
]);


//✔️Обновление данных

// Простое обновление
DB::table('users')->where('id', 1)->update(['name' => 'Johnny']);

// Инкремент / декремент
DB::table('users')->where('id', 1)->increment('balance', 100);
DB::table('users')->where('id', 1)->decrement('balance', 50);

// updateOrInsert
DB::table('settings')->updateOrInsert(
  ['key' => 'site_name'],
  ['value' => 'WayToHome']
);


//✔️Удаление

// Удалить одну запись
DB::table('users')->where('id', 1)->delete();

// Удалить всё
DB::table('logs')->delete();


//✔️Джойны

// Inner join: выберет только тех пользователей, у которых есть заказы
$users = DB::table('users')
  ->join('orders', 'users.id', '=', 'orders.user_id')
  ->select('users.*', 'orders.total')
  ->get();

// Left join: выберет всех пользователей, даже если у них нет профиля
$users = DB::table('users')
  ->leftJoin('profiles', 'users.id', '=', 'profiles.user_id')
  ->get();



//✔️Группировка и having

// Группировка: получим ID пользователей и сколько они всего потратили
$report = DB::table('orders')
  ->select('user_id', DB::raw('SUM(total) as total_spent')) // суммируем поле 'total' по каждому user_id
  ->groupBy('user_id') // группируем по пользователю
  ->having('total_spent', '>', 1000) // фильтруем тех, кто потратил больше 1000
  ->get();



//✔️Подзапросы

// Подзапрос в whereIn: выберем пользователей, у которых есть заказы
$users = DB::table('users')
  ->whereIn('id', function ($query) {
    $query->select('user_id')->from('orders'); // подзапрос возвращает user_id из таблицы orders
  })
  ->get();



//✔️Сырые SQL-запросы

// SELECT
$results = DB::select('SELECT * FROM users WHERE email = ?', ['john@example.com']);

// INSERT
DB::insert('INSERT INTO logs (text) VALUES (?)', ['something happened']);

// Общий SQL
DB::statement('DROP TABLE IF EXISTS temp_table');


//✔️Транзакции
DB::transaction(function () {
  DB::table('accounts')->where('id', 1)->decrement('balance', 100);
  DB::table('accounts')->where('id', 2)->increment('balance', 100);
});

// Пример ручного управления транзакциями в Laravel
use Illuminate\Support\Facades\DB;
use Exception;

try {
  DB::beginTransaction();

  DB::table('accounts')->where('id', 1)->decrement('balance', 100);
  DB::table('accounts')->where('id', 2)->increment('balance', 100);

  DB::commit(); // всё прошло успешно
} catch (Exception $e) {
  DB::rollBack(); // если ошибка — откат всех изменений

  // Можно залогировать ошибку или показать сообщение
  logger()->error('Ошибка перевода средств: ' . $e->getMessage());
}

✅ 5. Eloquent ORM — работа с моделями

Eloquent — объектно-реляционный маппер, который позволяет работать с базой через модели. Пример модели User:

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable
{
  protected $fillable = ['name', 'email', 'password'];
}
Работа с Eloquent:

// Создать пользователя
$user = User::create([
  'name' => 'Anna',
  'email' => 'anna@example.com',
  'password' => bcrypt('secret'),
]);

// Найти по id
$user = User::find(1);

// Обновить
$user->name = 'Anna Smith';
$user->save();

// Удалить
$user->delete();

// Получить всех
$allUsers = User::all();

✅ 6. Отношения в Eloquent

Laravel поддерживает разные виды связей: один к одному, один ко многим, многие ко многим и др. Пример отношения "один ко многим":

// В модели User
public function posts()
{
  return $this->hasMany(Post::class);
}

// В модели Post
public function user()
{
  return $this->belongsTo(User::class);
}
Использование:

$user = User::find(1);
$posts = $user->posts; // Все посты пользователя

✅ 7. Транзакции

Для атомарных операций удобно использовать транзакции:

DB::transaction(function () {
  $user = User::create([...]);
  $user->profile()->create([...]);
});
Если внутри транзакции происходит ошибка — все изменения откатываются.

✅ 8. Кэширование запросов

Laravel позволяет кэшировать результаты запросов, чтобы ускорить работу.

$users = Cache::remember('users.all', 60, function () {
  return User::all();
});
Здесь результат сохраняется в кэше на 60 минут.

✅ 9. Пагинация

Eloquent и Query Builder поддерживают пагинацию:

$users = User::paginate(15);
В Blade-шаблонах вывод:

{{ $users->links() }}

✅ 10. Обработка ошибок и логирование

Laravel автоматически ловит ошибки БД и логирует их. Для кастомной обработки можно использовать блоки try-catch:

try {
  User::create([...]);
} catch (\Exception $e) {
  Log::error('Ошибка при создании пользователя: ' . $e->getMessage());
  // дополнительная логика
}

✅ Итог

Laravel 10 предлагает полный набор удобных инструментов для работы с базой — от миграций и сидеров до ORM и транзакций. Они позволяют писать чистый, безопасный и поддерживаемый код, не углубляясь в сложный SQL. Если хочешь, могу подготовить и более продвинутые темы — например, кастомные запросы, оптимизацию или работу с репозиториями.

14.07.2025

4
A B i U S JS

PHP HTML CSS
Чат
    Для входа только имэйл или имя и апроль
    Можно сменить аватар
    Имэйл Ваше имя
    Пароль