Skip to content

Database: Bắt đầu (Getting Started)

Giới thiệu (Introduction)

Hầu hết ứng dụng web tương tác với database. Laravel hỗ trợ tương tác database cực kỳ đơn giản qua nhiều cơ sở dữ liệu:

DatabaseHỗ trợ
MariaDB 10.3+
MySQL 5.7+
PostgreSQL 10.0+
SQLite 3.35.0+
SQL Server 2017+

Cấu hình (Configuration)

File cấu hình: config/database.php. Mặc định sử dụng SQLite:

env
DB_CONNECTION=sqlite

Với MySQL:

env
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=

Với PostgreSQL:

env
DB_CONNECTION=pgsql
DB_HOST=127.0.0.1
DB_PORT=5432
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=

Read & Write Connections

Tách connections đọc/ghi (replication):

php
'mysql' => [
    'read' => [
        'host' => ['192.168.1.1', '196.168.1.2'],
    ],
    'write' => [
        'host' => ['196.168.1.3'],
    ],
    'sticky' => true,
    'driver' => 'mysql',
    'database' => 'database',
    'username' => 'root',
    'password' => '',
    // ...
],

Option sticky đảm bảo data ghi trong request hiện tại sẽ đọc ngay lập tức (tránh replication delay).

Chạy SQL Queries (Running SQL Queries)

Select

php
use Illuminate\Support\Facades\DB;

$users = DB::select('select * from users where active = ?', [1]);

// Named bindings
$results = DB::select('select * from users where id = :id', ['id' => 1]);

Kết quả trả về array của stdClass objects.

Insert

php
DB::insert('insert into users (id, name) values (?, ?)', [1, 'Marc']);

Update

php
$affected = DB::update('update users set votes = 100 where name = ?', ['Anita']);

Delete

php
$deleted = DB::delete('delete from users where votes > ?', [100]);

Statement

php
DB::statement('drop table users');

Unprepared Statements

php
DB::unprepared('update users set votes = 100 where name = "Dries"');

LƯU Ý

Unprepared statements không bind parameters, có thể gây SQL injection. Cẩn thận với user input.

Nhiều Database Connections

php
$users = DB::connection('sqlite')->select(/* ... */);

Lắng nghe Query Events

php
use Illuminate\Database\Events\QueryExecuted;
use Illuminate\Support\Facades\DB;

DB::listen(function (QueryExecuted $query) {
    // $query->sql       — SQL string
    // $query->bindings  — Parameter bindings
    // $query->time      — Thời gian thực thi (ms)
});

Monitoring thời gian Query tích lũy

php
DB::whenQueryingForLongerThan(500, function (Connection $connection, QueryExecuted $event) {
    // Gửi notification khi queries tổng > 500ms
});

Database Transactions

php
use Illuminate\Support\Facades\DB;

DB::transaction(function () {
    DB::update('update users set votes = 1');
    DB::delete('delete from posts');
});

Handling Deadlocks

Tham số thứ 2 = số lần retry khi deadlock:

php
DB::transaction(function () {
    DB::update('update users set votes = 1');
    DB::delete('delete from posts');
}, 5); // Retry 5 lần

Transaction thủ công

php
DB::beginTransaction();

try {
    DB::update(/* ... */);
    DB::commit();
} catch (\Exception $e) {
    DB::rollBack();
    throw $e;
}

Kết nối Database CLI

bash
php artisan db           # Kết nối default database
php artisan db mysql     # Kết nối connection cụ thể

Kiểm tra Databases (Inspecting)

bash
php artisan db:show
php artisan db:table users

Giám sát Databases (Monitoring)

bash
php artisan db:monitor --databases=mysql,pgsql --max=100

Khi số connections vượt ngưỡng, event DatabaseBusy được dispatch.