Laravel支持多数据库连接,通过在config/database.php中定义多个连接并在模型中使用$connection属性或DB门面的connection()方法指定连接,实现不同数据源的操作。
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=
配置完成后,你就可以在代码中通过多种方式使用这些连接了。
为一个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()
secondary_mysql
如果某些情况下你需要动态切换连接,例如,一个模型在某些操作中需要访问默认数据库,在另一些操作中需要访问辅助数据库,你可以使用
setConnection()
$report = new AnalyticsReport(); $report->setConnection('mysql'); // 临时切换到默认连接 $report->some_property = 'value'; $report->save();
但通常来说,我个人倾向于一个模型固定一个连接,如果业务逻辑复杂到需要动态切换,那可能需要重新审视模型或服务的设计了。
除了Eloquent模型,Laravel的DB门面(
Illuminate\Support\Facades\DB
DB门面提供了一个
connection()
config/database.php
table()
select()
insert()
update()
delete()
举个例子,如果你想从
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中的事务是针对单个数据库连接的。这意味着,如果你在
secondary_mysql
secondary_mysql
mysql
要为特定连接管理事务,你需要明确指定连接:
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')
数据迁移(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
在我看来,这种分离的迁移管理方式虽然初期配置稍显繁琐,但长期来看,它能清晰地界定每个数据库的职责和结构,避免了不同数据库的迁移文件混淆在一起,大大降低了维护的复杂性。如果你的多个数据库结构完全不同,或者由不同的团队负责,这种方式几乎是必须的。
以上就是Laravel多数据库连接?数据库连接如何配置?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号