【问题标题】:Multiple databases in Laravel PHP [duplicate]Laravel PHP中的多个数据库[重复]
【发布时间】:2017-07-18 08:43:36
【问题描述】:

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

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

问题:

  1. 实现这一目标的最佳方法是什么?
  2. 我们在哪里存储每个租户的数据库连接信息?
  3. 有时,我们可能不得不对租户和主数据库中的表进行连接查询。 这将如何运作?

提前感谢您的阅读和任何可能的解决方案。

【问题讨论】:

    标签: php laravel multi-database


    【解决方案1】:

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

    config/database.php
    

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

    切换连接:

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

    【讨论】:

      【解决方案2】:

      我们可以在连接部分config/database.php中设置DB连接:

      '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,
          ],
      ],
      

      对于模型,我们可以添加

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

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

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

      如果你使用 Eloquent ORM,我们可以在上面使用setConnection('mysql2')

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

      这个答案基于这个question

      【讨论】:

      • 感谢您的宝贵意见。但是,在我们的应用程序中,我们将继续创建多个租户,并且每个租户都有一个单独的数据库。因此,我们需要一种机制来存储每个租户的数据库连接信息。关于如何实现这一目标的任何意见?
      【解决方案3】:

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

      希望对你有帮助

      【讨论】:

        猜你喜欢
        • 2017-11-07
        • 2018-06-16
        • 2018-03-28
        • 2018-12-07
        • 2020-01-28
        • 2017-09-05
        • 2014-06-27
        • 2016-01-16
        • 2017-02-20
        相关资源
        最近更新 更多