Giao diện
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:
| Database | Hỗ 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=sqliteVớ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ầnTransaction 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 usersGiám sát Databases (Monitoring)
bash
php artisan db:monitor --databases=mysql,pgsql --max=100Khi số connections vượt ngưỡng, event DatabaseBusy được dispatch.