Laravel PHP中的多个数据库

时间:2017-07-18 08:43:37

标签: php laravel multi-database

我们正在构建一个多租户应用程序。通过管理界面,我们将在需要时添加新租户。此应用程序需要使用1 + n数据库。

1个主数据库,大约有5个表。 n我们创建的每个租户的数据库。特定于租户的数据库可以完全驻留在单独的数据库服务器上。

问题:

  1. 实现这一目标的最佳方法是什么?
  2. 我们在哪里存储每个租户的数据库连接信息?
  3. 有时,我们可能必须在租户和主数据库中的表上触发连接查询。 这怎么样?
  4. 请提前感谢阅读和任何可能的解决方案。

3 个答案:

答案 0 :(得分:0)

Google是您的朋友,文档也是如此: https://laravel.com/docs/5.4/database#using-multiple-database-connections

config/database.php

为要使用的每个数据库连接添加新连接。

切换连接:

$users = DB::connection('foo')->select(...);

答案 1 :(得分:0)

我们可以在连接部分的config/database.php中设置数据库连接:

'connections' => [
    //Our primary DB
    'mysql' => [
        'driver' => 'mysql',
        'host' => env('DB_HOST', 'localhost'),
        'port' => env('DB_PORT', '3306'),
        'database' => env('DB_DATABASE', 'forge'),
        'username' => env('DB_USERNAME', 'forge'),
        'password' => env('DB_PASSWORD', ''),
        'charset' => 'utf8',
        'collation' => 'utf8_unicode_ci',
        'prefix' => '',
        'strict' => false,
        'engine' => null,
    ],
    //Secondary DB
    'mysql2' => [
        'driver' => 'mysql',
        'host' => env('DB_HOST', 'localhost'),
        'port' => env('DB_PORT', '3306'),
        'database' => env('DB2_DATABASE', 'secondary'),
        'username' => env('DB2_USERNAME', 'forge'),
        'password' => env('DB2_PASSWORD', ''),
        'charset' => 'utf8',
        'collation' => 'utf8_unicode_ci',
        'prefix' => '',
        'strict' => false,
        'engine' => null,
    ],
],

对于Model,我们可以添加

class User2 extends Model
{
   protected $connection = 'mysql2';
}

在迁移中我们可以使用连接方法。

Schema::connection('mysql2')->create('table')

如果您使用Eloquent ORM,我们可以使用setConnection('mysql2')

$user = new User2;
$user->setConnection('mysql2');

此答案基于此question

答案 2 :(得分:0)

在我的情况下,不会使用多租户 在主数据库中存储子数据库配置 在中间件中设置子数据库参数 在需要的模型中使用$ connection ='child' 加入是不可能的,因为可能是不同的服务器,但很大一部分关系是有效的工作(不是whereExists,withCount ..等)

希望它有所帮助