0

0

Laravel多数据库连接?数据库连接如何配置?

小老鼠

小老鼠

发布时间:2025-09-07 08:04:01

|

829人浏览过

|

来源于php中文网

原创

Laravel支持多数据库连接,通过在config/database.php中定义多个连接并在模型中使用$connection属性或DB门面的connection()方法指定连接,实现不同数据源的操作。

laravel多数据库连接?数据库连接如何配置?

Laravel当然支持多数据库连接,这在处理复杂系统或集成遗留数据时非常常见且实用。配置起来也并不复杂,主要集中在

config/database.php
这个配置文件里,你可以在那里定义多个数据库连接的详细信息,然后在代码中根据需要指定使用哪个连接。

解决方案

要在Laravel中配置和使用多数据库连接,核心在于编辑

config/database.php
文件。这个文件包含了所有数据库连接的定义。

首先,打开

config/database.php
。你会看到一个
connections
数组,里面默认已经有了
mysql
,
pgsql
,
sqlite
,
sqlsrv
等连接配置。要添加一个新的连接,你只需在这个数组中加入一个新的键值对,例如:

// config/database.php

'connections' => [

    'mysql' => [
        'driver' => 'mysql',
        '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', ''),
        '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'),
        ]) : [],
    ],

    // 添加一个新的数据库连接,例如 'secondary_mysql'
    'secondary_mysql' => [
        'driver' => 'mysql',
        'host' => env('DB_SECONDARY_HOST', '192.168.1.10'), // 另一个数据库的主机
        'port' => env('DB_SECONDARY_PORT', '3306'),
        'database' => env('DB_SECONDARY_DATABASE', 'analytics_db'), // 另一个数据库名
        'username' => env('DB_SECONDARY_USERNAME', 'analytics_user'),
        'password' => env('DB_SECONDARY_PASSWORD', 'secret'),
        'charset' => 'utf8mb4',
        'collation' => 'utf8mb4_unicode_ci',
        'prefix' => '',
        'strict' => true,
        'engine' => null,
    ],

    // 你也可以添加其他类型的数据库连接,比如 PostgreSQL
    'pgsql_analytics' => [
        'driver' => 'pgsql',
        'host' => env('DB_PGSQL_HOST', '127.0.0.1'),
        'port' => env('DB_PGSQL_PORT', '5432'),
        'database' => env('DB_PGSQL_DATABASE', 'reporting_db'),
        'username' => env('DB_PGSQL_USERNAME', 'reporting_user'),
        'password' => env('DB_PGSQL_PASSWORD', ''),
        'charset' => 'utf8',
        'prefix' => '',
        'prefix_indexes' => true,
        'schema' => 'public',
        'sslmode' => 'prefer',
    ],

],

.env
文件中,你需要为这些新的连接定义相应的环境变量

DB_SECONDARY_HOST=192.168.1.10
DB_SECONDARY_PORT=3306
DB_SECONDARY_DATABASE=analytics_db
DB_SECONDARY_USERNAME=analytics_user
DB_SECONDARY_PASSWORD=secret

DB_PGSQL_HOST=127.0.0.1
DB_PGSQL_PORT=5432
DB_PGSQL_DATABASE=reporting_db
DB_PGSQL_USERNAME=reporting_user
DB_PGSQL_PASSWORD=

配置完成后,你就可以在代码中通过多种方式使用这些连接了。

在Laravel中,如何为不同的Eloquent模型指定不同的数据库连接?

为一个Eloquent模型指定不同的数据库连接是多数据库场景下最常见的做法之一。这通常用于将特定业务逻辑或数据存储在独立的数据库中。在我看来,这种方式让代码结构更清晰,也更容易维护,因为每个模型都“知道”自己的数据源。

你只需在Eloquent模型中添加一个

$connection
属性,并将其值设置为你在
config/database.php
中定义好的连接名称。

例如,假设你有一个

User
模型,它使用默认的
mysql
连接,但你还有一个
AnalyticsReport
模型,它的数据存储在
secondary_mysql
数据库中。你可以这样定义
AnalyticsReport
模型:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class AnalyticsReport extends Model
{
    use HasFactory;

    /**
     * 与模型关联的数据库连接。
     *
     * @var string
     */
    protected $connection = 'secondary_mysql'; // 指定使用 secondary_mysql 连接

    /**
     * 与模型关联的表名。
     *
     * @var string
     */
    protected $table = 'analytics_reports'; // 假设表名是 analytics_reports

    // ... 其他模型属性和方法
}

这样一来,每当你通过

AnalyticsReport::query()
new AnalyticsReport()
来操作数据时,Laravel都会自动使用
secondary_mysql
这个连接。这省去了在每次查询时手动指定连接的麻烦,让代码更加简洁。

如果某些情况下你需要动态切换连接,例如,一个模型在某些操作中需要访问默认数据库,在另一些操作中需要访问辅助数据库,你可以使用

setConnection()
方法:

$report = new AnalyticsReport();
$report->setConnection('mysql'); // 临时切换到默认连接
$report->some_property = 'value';
$report->save();

但通常来说,我个人倾向于一个模型固定一个连接,如果业务逻辑复杂到需要动态切换,那可能需要重新审视模型或服务的设计了。

Laravel DB门面如何操作多个数据库连接?

除了Eloquent模型,Laravel的DB门面(

Illuminate\Support\Facades\DB
)也是操作数据库的利器,尤其是在执行原生SQL查询、构建复杂查询或者处理不需要ORM开销的场景时。使用DB门面操作多数据库连接同样非常直接。

DB门面提供了一个

connection()
方法,你可以传入你在
config/database.php
中定义的连接名称来获取一个特定数据库的连接实例。一旦获取到这个实例,你就可以像操作默认连接一样,调用其上的各种方法,比如
table()
,
select()
,
insert()
,
update()
,
delete()
等。

Flowith
Flowith

一款GPT4驱动的节点式 AI 创作工具

下载

举个例子,如果你想从

secondary_mysql
连接的
logs
表中获取数据:

use Illuminate\Support\Facades\DB;

// 从 secondary_mysql 连接获取所有日志
$secondaryLogs = DB::connection('secondary_mysql')->table('logs')->get();

// 在 pgsql_analytics 连接中插入一条数据
DB::connection('pgsql_analytics')->table('daily_stats')->insert([
    'date' => now()->toDateString(),
    'views' => 1234,
    'unique_visitors' => 567,
]);

// 执行一个原生查询
$rawResults = DB::connection('secondary_mysql')->select('SELECT * FROM audit_trail WHERE user_id = ?', [1]);

这种方式的灵活性很高,特别适合那些一次性的查询或者当你需要精确控制SQL语句的场景。我个人在使用DB门面时,会更倾向于它在处理一些报表统计、批量操作或者与遗留系统交互时,能够直接执行SQL,避免了ORM的额外开销。不过,也需要注意,使用原生SQL意味着你需要自己管理SQL注入的风险,所以参数绑定是必不可少的。

Laravel多数据库连接时,事务管理和数据迁移应如何处理?

在多数据库连接的环境下,事务管理和数据迁移会变得稍微复杂一些,因为它们通常是针对单个数据库连接操作的。理解这一点非常重要,可以避免一些潜在的数据不一致问题。

事务管理: Laravel中的事务是针对单个数据库连接的。这意味着,如果你在

secondary_mysql
连接上开启一个事务,它只会影响
secondary_mysql
数据库上的操作,而不会影响
mysql
或其他任何连接。你不能在一个事务中同时包含跨越不同数据库连接的操作,并期望它们能原子性地提交或回滚。这不是分布式事务,Laravel默认不提供这种功能。

要为特定连接管理事务,你需要明确指定连接:

use Illuminate\Support\Facades\DB;

DB::connection('secondary_mysql')->beginTransaction();
try {
    DB::connection('secondary_mysql')->table('orders')->insert(['item' => 'Product A', 'quantity' => 1]);
    DB::connection('secondary_mysql')->table('inventory')->where('item', 'Product A')->decrement('stock', 1);

    // 如果这里有任何异常,下面的 commit 不会被执行,而是会跳到 catch 块
    DB::connection('secondary_mysql')->commit();
} catch (\Exception $e) {
    DB::connection('secondary_mysql')->rollBack();
    // 处理异常
    throw $e;
}

可以看到,所有的

DB::connection('secondary_mysql')
调用都确保了操作作用于同一个数据库连接的事务上下文中。我个人在设计系统时,如果确实需要跨数据库的“逻辑事务”,通常会采用补偿机制、消息队列或者更高级的分布式事务解决方案,而不是试图在一个PHP请求中强制实现。

数据迁移(Migrations): Laravel的数据迁移工具默认是针对

config/database.php
中定义的默认连接(通常是
mysql
)。如果你有多个数据库,并且每个数据库都有自己独立的表结构需要管理,那么你需要一些额外的步骤。

一种常见且我推荐的做法是为不同的数据库创建独立的迁移路径。你可以在

config/database.php
中为每个连接定义其迁移文件的路径:

// config/database.php

'connections' => [
    // ... 其他连接

    'secondary_mysql' => [
        // ... 连接配置
        'migrations_paths' => [
            database_path('migrations/secondary_mysql'),
        ],
    ],
    'pgsql_analytics' => [
        // ... 连接配置
        'migrations_paths' => [
            database_path('migrations/pgsql_analytics'),
        ],
    ],
],

然后,你需要创建这些对应的文件夹:

database/migrations/secondary_mysql
database/migrations/pgsql_analytics

在运行迁移时,你可以使用

--database
选项来指定要运行迁移的连接:

# 运行默认连接的迁移
php artisan migrate

# 运行 secondary_mysql 连接的迁移
php artisan migrate --database=secondary_mysql

# 运行 pgsql_analytics 连接的迁移
php artisan migrate --database=pgsql_analytics

当生成新的迁移文件时,你也可以指定连接:

# 为 secondary_mysql 连接生成迁移
php artisan make:migration create_secondary_users_table --database=secondary_mysql --path=database/migrations/secondary_mysql

请注意,

--path
选项是必要的,它告诉Artisan将迁移文件放在哪里。

在我看来,这种分离的迁移管理方式虽然初期配置稍显繁琐,但长期来看,它能清晰地界定每个数据库的职责和结构,避免了不同数据库的迁移文件混淆在一起,大大降低了维护的复杂性。如果你的多个数据库结构完全不同,或者由不同的团队负责,这种方式几乎是必须的。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
laravel组件介绍
laravel组件介绍

laravel 提供了丰富的组件,包括身份验证、模板引擎、缓存、命令行工具、数据库交互、对象关系映射器、事件处理、文件操作、电子邮件发送、队列管理和数据验证。想了解更多laravel的相关内容,可以阅读本专题下面的文章。

341

2024.04.09

laravel中间件介绍
laravel中间件介绍

laravel 中间件分为五种类型:全局、路由、组、终止和自定。想了解更多laravel中间件的相关内容,可以阅读本专题下面的文章。

295

2024.04.09

laravel使用的设计模式有哪些
laravel使用的设计模式有哪些

laravel使用的设计模式有:1、单例模式;2、工厂方法模式;3、建造者模式;4、适配器模式;5、装饰器模式;6、策略模式;7、观察者模式。想了解更多laravel的相关内容,可以阅读本专题下面的文章。

795

2024.04.09

thinkphp和laravel哪个简单
thinkphp和laravel哪个简单

对于初学者来说,laravel 的入门门槛较低,更易上手,原因包括:1. 更简单的安装和配置;2. 丰富的文档和社区支持;3. 简洁易懂的语法和 api;4. 平缓的学习曲线。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

386

2024.04.10

laravel入门教程
laravel入门教程

本专题整合了laravel入门教程,想了解更多详细内容,请阅读专题下面的文章。

146

2025.08.05

laravel实战教程
laravel实战教程

本专题整合了laravel实战教程,阅读专题下面的文章了解更多详细内容。

86

2025.08.05

laravel面试题
laravel面试题

本专题整合了laravel面试题相关内容,阅读专题下面的文章了解更多详细内容。

84

2025.08.05

PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

753

2026.03.04

chatgpt使用指南
chatgpt使用指南

本专题整合了chatgpt使用教程、新手使用说明等等相关内容,阅读专题下面的文章了解更多详细内容。

0

2026.03.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Laravel---API接口
Laravel---API接口

共7课时 | 0.7万人学习

PHP自制框架
PHP自制框架

共8课时 | 0.6万人学习

PHP面向对象基础课程(更新中)
PHP面向对象基础课程(更新中)

共12课时 | 0.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号