数据库配置 #
一、配置文件 #
1.1 配置位置 #
数据库配置位于 config/database.php 文件中,环境变量在 .env 文件设置。
php
// config/database.php
return [
'default' => env('DB_CONNECTION', 'mysql'),
'connections' => [
// 各种数据库连接配置
],
];
1.2 环境变量 #
env
# .env 文件
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=
二、支持的数据库 #
2.1 MySQL配置 #
php
'mysql' => [
'driver' => 'mysql',
'url' => env('DATABASE_URL'),
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', 'laravel'),
'username' => env('DB_USERNAME', 'root'),
'password' => env('DB_PASSWORD', ''),
'unix_socket' => env('DB_SOCKET', ''),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'prefix_indexes' => true,
'strict' => true,
'engine' => null,
'options' => extension_loaded('pdo_mysql') ? array_filter([
PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
]) : [],
],
2.2 PostgreSQL配置 #
php
'pgsql' => [
'driver' => 'pgsql',
'url' => env('DATABASE_URL'),
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '5432'),
'database' => env('DB_DATABASE', 'laravel'),
'username' => env('DB_USERNAME', 'root'),
'password' => env('DB_PASSWORD', ''),
'charset' => 'utf8',
'prefix' => '',
'prefix_indexes' => true,
'search_path' => 'public',
'sslmode' => 'prefer',
],
2.3 SQLite配置 #
php
'sqlite' => [
'driver' => 'sqlite',
'url' => env('DATABASE_URL'),
'database' => env('DB_DATABASE', database_path('database.sqlite')),
'prefix' => '',
'prefix_indexes' => true,
],
bash
# 创建SQLite数据库文件
touch database/database.sqlite
2.4 SQL Server配置 #
php
'sqlsrv' => [
'driver' => 'sqlsrv',
'url' => env('DATABASE_URL'),
'host' => env('DB_HOST', 'localhost'),
'port' => env('DB_PORT', '1433'),
'database' => env('DB_DATABASE', 'laravel'),
'username' => env('DB_USERNAME', 'root'),
'password' => env('DB_PASSWORD', ''),
'charset' => 'utf8',
'prefix' => '',
'prefix_indexes' => true,
],
三、读写分离 #
3.1 配置读写分离 #
php
'mysql' => [
'driver' => 'mysql',
'read' => [
'host' => [
'192.168.1.1',
'192.168.1.2',
],
],
'write' => [
'host' => [
'196.168.1.3',
],
],
'sticky' => true,
'database' => 'laravel',
'username' => 'root',
'password' => '',
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
],
3.2 配置说明 #
| 配置项 | 说明 |
|---|---|
| read | 读服务器配置 |
| write | 写服务器配置 |
| sticky | 写入后当前请求使用主库读取 |
3.3 随机选择读服务器 #
php
'read' => [
'host' => [
'192.168.1.1',
'192.168.1.2',
],
],
// Laravel会随机选择一个读服务器
四、多数据库连接 #
4.1 配置多个连接 #
php
'connections' => [
'mysql' => [
// 主数据库
],
'mysql_logs' => [
'driver' => 'mysql',
'host' => env('DB_LOGS_HOST', '127.0.0.1'),
'database' => env('DB_LOGS_DATABASE', 'logs'),
'username' => env('DB_LOGS_USERNAME', 'root'),
'password' => env('DB_LOGS_PASSWORD', ''),
],
'pgsql' => [
// PostgreSQL
],
],
4.2 使用指定连接 #
php
// 使用默认连接
$users = DB::table('users')->get();
// 使用指定连接
$users = DB::connection('mysql_logs')->table('users')->get();
// 在模型中指定连接
class Log extends Model
{
protected $connection = 'mysql_logs';
}
// 运行时切换连接
$log = new Log;
$log->setConnection('mysql_logs');
$logs = $log->get();
五、数据库URL #
5.1 使用URL配置 #
env
DATABASE_URL=mysql://root:password@127.0.0.1:3306/laravel
5.2 URL格式 #
text
driver://username:password@host:port/database
5.3 配置示例 #
php
'mysql' => [
'driver' => 'mysql',
'url' => env('DATABASE_URL'),
// 其他配置会从URL解析
],
六、连接池 #
6.1 配置连接池 #
php
'mysql' => [
'driver' => 'mysql',
// ...
'pool' => [
'min_connections' => 1,
'max_connections' => 10,
'idle_timeout' => 60,
],
],
七、数据库操作基础 #
7.1 获取连接 #
php
use Illuminate\Support\Facades\DB;
// 获取PDO实例
$pdo = DB::connection()->getPdo();
// 获取原生PDO连接
$pdo = DB::connection()->getRawPdo();
7.2 执行原生SQL #
php
// 执行查询
$users = DB::select('SELECT * FROM users WHERE active = ?', [1]);
// 执行插入
DB::insert('INSERT INTO users (name, email) VALUES (?, ?)', ['John', 'john@example.com']);
// 执行更新
$affected = DB::update('UPDATE users SET votes = 100 WHERE name = ?', ['John']);
// 执行删除
$deleted = DB::delete('DELETE FROM users WHERE id = ?', [1]);
// 执行通用语句
DB::statement('DROP TABLE users');
7.3 事务处理 #
php
// 自动事务
DB::transaction(function () {
DB::table('users')->update(['votes' => 0]);
DB::table('posts')->delete();
});
// 手动事务
DB::beginTransaction();
try {
DB::table('users')->update(['votes' => 0]);
DB::table('posts')->delete();
DB::commit();
} catch (\Exception $e) {
DB::rollBack();
throw $e;
}
// 事务嵌套
DB::transaction(function () {
DB::transaction(function () {
// 嵌套事务
});
});
7.4 监听SQL查询 #
php
// 在服务提供者中注册
DB::listen(function ($query) {
logger()->info('SQL', [
'sql' => $query->sql,
'bindings' => $query->bindings,
'time' => $query->time,
]);
});
八、数据库事件 #
8.1 连接事件 #
php
// 连接建立时
DB::whenConnected(function ($connection) {
logger('Database connected: ' . $connection);
});
// 连接失败时
DB::whenDisconnected(function ($connection) {
logger('Database disconnected: ' . $connection);
});
九、配置最佳实践 #
9.1 环境分离 #
env
# 本地开发
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_DATABASE=laravel_local
# 测试环境
DB_CONNECTION=mysql
DB_HOST=192.168.1.100
DB_DATABASE=laravel_staging
# 生产环境
DB_CONNECTION=mysql
DB_HOST=production-db.example.com
DB_DATABASE=laravel_production
9.2 安全配置 #
php
'mysql' => [
// ...
'strict' => true, // 启用严格模式
'engine' => 'InnoDB',
'options' => [
PDO::ATTR_EMULATE_PREPARES => false, // 禁用模拟预处理
PDO::ATTR_STRINGIFY_FETCHES => false,
],
],
9.3 性能优化 #
php
'mysql' => [
// ...
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'options' => [
PDO::ATTR_PERSISTENT => true, // 持久连接
PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8mb4',
],
],
十、常见问题 #
10.1 连接超时 #
php
'mysql' => [
// ...
'options' => [
PDO::ATTR_TIMEOUT => 30,
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
],
],
10.2 SSL连接 #
php
'mysql' => [
// ...
'options' => [
PDO::MYSQL_ATTR_SSL_CA => '/path/to/ca.pem',
PDO::MYSQL_ATTR_SSL_CERT => '/path/to/cert.pem',
PDO::MYSQL_ATTR_SSL_KEY => '/path/to/key.pem',
],
],
10.3 字符集问题 #
php
'mysql' => [
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
],
十一、调试工具 #
11.1 查看执行的SQL #
php
// 开启查询日志
DB::enableQueryLog();
// 执行查询
$users = DB::table('users')->get();
// 查看日志
dd(DB::getQueryLog());
11.2 Laravel Debugbar #
bash
composer require barryvdh/laravel-debugbar --dev
11.3 Telescope #
bash
composer require laravel/telescope
php artisan telescope:install
php artisan migrate
十二、总结 #
12.1 核心要点 #
| 要点 | 说明 |
|---|---|
| 配置文件 | config/database.php |
| 环境变量 | .env文件 |
| 支持数据库 | MySQL, PostgreSQL, SQLite, SQL Server |
| 读写分离 | read/write配置 |
| 多连接 | connection()方法 |
12.2 下一步 #
掌握了数据库配置后,让我们继续学习 查询构建器,了解Laravel强大的数据库查询功能!
最后更新:2026-03-28