数据库配置 #

一、配置文件 #

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