Laravel 支持多数据库连接,需在 .env 中配置各库环境变量,并在 config/database.php 中注册对应连接名;模型通过 $connection 属性指定使用哪个连接。

在 Laravel 中连接多个数据库并不复杂,关键是正确配置多个数据库连接,并在模型或查询时明确指定使用哪一个。
一、配置多个数据库连接
打开 .env 文件,为每个数据库定义独立的环境变量:
# 默认数据库(mysql) DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=main_db DB_USERNAME=root DB_PASSWORD= <h1>第二个数据库(比如日志库)</h1><p>LOG_DB_CONNECTION=mysql LOG_DB_HOST=127.0.0.1 LOG_DB_PORT=3306 LOG_DB_DATABASE=log_db LOG_DB_USERNAME=root LOG_DB_PASSWORD=</p><h1>第三个数据库(比如报表库,可选 PostgreSQL)</h1><p>REPORT_DB_CONNECTION=pgsql REPORT_DB_HOST=127.0.0.1 REPORT_DB_PORT=5432 REPORT_DB_DATABASE=report_db REPORT_DB_USERNAME=postgres REPORT_DB_PASSWORD=</p>
接着在 config/database.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', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
// ...其他选项(charset, collation 等)
],
<p>'log_mysql' => [
'driver' => 'mysql',
'host' => env('LOG_DB_HOST', '127.0.0.1'),
'port' => env('LOG_DB_PORT', '3306'),
'database' => env('LOG_DB_DATABASE', 'forge'),
'username' => env('LOG_DB_USERNAME', 'forge'),
'password' => env('LOG_DB_PASSWORD', ''),
// 注意:不加 'url' 字段,避免覆盖
],</p><p>'report_pgsql' => [
'driver' => 'pgsql',
'host' => env('REPORT_DB_HOST', '127.0.0.1'),
'port' => env('REPORT_DB_PORT', '5432'),
'database' => env('REPORT_DB_DATABASE', 'forge'),
'username' => env('REPORT_DB_USERNAME', 'forge'),
'password' => env('REPORT_DB_PASSWORD', ''),
],</p>二、在模型中指定数据库连接
每个 Eloquent 模型可通过 $connection 属性绑定特定连接:
- 主业务模型(用默认连接)无需设置
-
日志模型 显式指定:
protected $connection = 'log_mysql'; -
报表模型 支持跨类型:
protected $connection = 'report_pgsql';
示例:
<?php
<p>namespace App\Models;</p><div class="aritcle_card flexRow">
<div class="artcardd flexRow">
<a class="aritcle_card_img" href="/ai/794" title="天工大模型"><img
src="https://img.php.cn/upload/ai_manual/000/000/000/175679968422723.png" alt="天工大模型" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a href="/ai/794" title="天工大模型">天工大模型</a>
<p>中国首个对标ChatGPT的双千亿级大语言模型</p>
</div>
<a href="/ai/794" title="天工大模型" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a>
</div>
</div><p>use Illuminate\Database\Eloquent\Model;</p><p>class UserLog extends Model
{
protected $connection = 'log_mysql'; // 对应 config/database.php 中的键名
protected $table = 'user_logs';
}</p>三、运行时动态切换连接
不依赖模型时,可用 DB 门面手动指定连接:
DB::connection('log_mysql')->table('user_logs')->get();DB::connection('report_pgsql')->select('SELECT * FROM sales_summary');- 事务也支持多库:
DB::connection('log_mysql')->transaction(function () { ... });
注意:跨库事务无法保证原子性(尤其异构数据库),建议业务层做补偿或分步提交。
四、验证与调试技巧
快速确认连接是否生效:
- 用
php artisan tinker手动测试:DB::connection('log_mysql')->getPdo();不报错即通 - 查看当前连接:
DB::connection()->getDatabaseName() - 开启查询日志:
DB::connection('log_mysql')->enableQueryLog();再执行查询后用DB::connection('log_mysql')->getQueryLog()查看
基本上就这些。多库不是黑魔法,核心是配置清晰、调用明确、边界清楚。









