✅ 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. Если хочешь, могу подготовить и более продвинутые темы — например, кастомные запросы, оптимизацию или работу с репозиториями.