两个Laravel项目如何读取共用的第三方数据库?
解决Laravel多项目读取共享数据库的方案
嘿,这个场景我太熟了!很多团队做项目拆分或微服务架构时都会遇到共享通用数据的需求,Laravel本身对多数据库的支持已经很完善了,咱们一步步来配置就行:
1. 先配置共享数据库的连接信息
不管是laravel_a还是laravel_b,都需要在两个项目里完成同样的配置:
第一步:修改.env文件
在每个项目的.env文件末尾,添加共享数据库的专属配置项:
# 共享数据库配置 DB_COMMON_CONNECTION=mysql DB_COMMON_HOST=127.0.0.1 DB_COMMON_PORT=3306 DB_COMMON_DATABASE=database_common DB_COMMON_USERNAME=你的数据库用户名 DB_COMMON_PASSWORD=你的数据库密码
第二步:配置config/database.php
打开config/database.php,找到connections数组,在里面新增一个名为common的连接配置:
'common' => [ 'driver' => env('DB_COMMON_CONNECTION', 'mysql'), 'host' => env('DB_COMMON_HOST', '127.0.0.1'), 'port' => env('DB_COMMON_PORT', '3306'), 'database' => env('DB_COMMON_DATABASE', 'database_common'), 'username' => env('DB_COMMON_USERNAME', 'root'), 'password' => env('DB_COMMON_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. 在模型中指定共享连接
如果你的通用数据有对应的模型(比如CommonConfig、CommonRegion),只需要在模型里指定$connection属性,就能直接用模型操作共享数据库了:
namespace App\Models; use Illuminate\Database\Eloquent\Model; class CommonConfig extends Model { // 指定使用共享数据库连接 protected $connection = 'common'; // 对应共享数据库里的表名 protected $table = 'configs'; }
之后在控制器里直接调用CommonConfig::all(),就能读取共享数据库里的configs表数据了。
3. 直接用查询构造器操作共享数据库
如果不想为共享表创建模型,也可以通过DB门面指定连接来直接查询:
// 查询共享数据库里的users表 $commonUsers = \DB::connection('common')->table('users')->get(); // 链式调用做复杂查询 $activeUsers = \DB::connection('common') ->table('users') ->where('status', 1) ->orderBy('created_at', 'desc') ->limit(10) ->get();
4. 额外注意事项
- 数据库权限:确保两个项目使用的数据库用户(包括项目自身的用户和共享库的用户)拥有对
database_common的SELECT权限(如果需要写入操作,还要额外配置INSERT/UPDATE/DELETE权限)。 - 迁移与种子:如果需要在共享数据库里建表或填充初始化数据,可以指定连接运行迁移/种子命令:
# 运行共享库的迁移文件 php artisan migrate --database=common # 运行共享库的种子文件 php artisan db:seed --database=common --class=CommonSeeder - 跨库关联:如果需要在项目自有模型和共享模型之间做关联查询,只要两个模型分别指定正确的数据库连接,Laravel会自动处理跨库关联逻辑。
这样两个项目就能无缝读取共享数据库的数据啦,要是还有更复杂的场景(比如读写分离、跨库事务),咱们再细聊~
内容的提问来源于stack exchange,提问作者zwl1619




