You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

两个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. 在模型中指定共享连接

如果你的通用数据有对应的模型(比如CommonConfigCommonRegion),只需要在模型里指定$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

火山引擎 最新活动