Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/226.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Laravel PHP中的多个数据库_Php_Laravel_Multi Database - Fatal编程技术网

Laravel PHP中的多个数据库

Laravel PHP中的多个数据库,php,laravel,multi-database,Php,Laravel,Multi Database,我们正在构建一个多租户应用程序。通过管理界面,我们将在需要时添加新租户。此应用程序需要使用1+n数据库 1个主数据库,约5个表。 n我们创建的每个租户的DBs。特定于租户的数据库可能全部驻留在单独的db服务器上 问题: 实现这一目标的最佳方式是什么 我们在哪里存储每个租户的数据库连接信息 有时,我们可能不得不对租户和主数据库中的表发出连接查询。 这是怎么回事 请提前感谢您的阅读和任何可能的解决方案。谷歌是您的朋友,文档也是您的朋友: 并为要使用的每个数据库连接添加一个新连接 要切换连接,请执行

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

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

问题:

  • 实现这一目标的最佳方式是什么
  • 我们在哪里存储每个租户的数据库连接信息
  • 有时,我们可能不得不对租户和主数据库中的表发出连接查询。 这是怎么回事

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

    谷歌是您的朋友,文档也是您的朋友:

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

    要切换连接,请执行以下操作:

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

    我们可以在连接部分的
    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,
        ],
    ],
    
    对于模型,我们可以添加

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

    Schema::connection('mysql2')->create('table'))
    
    如果您使用雄辩的ORM,我们可以在其上使用
    setConnection('mysql2')

    $user=newuser2;
    $user->setConnection('mysql2');
    

    此答案基于此

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


    希望对您有所帮助

    谢谢您的宝贵意见。然而,在我们的应用程序中,我们将继续创建多个租户,每个租户将有一个单独的数据库。因此,我们需要一种机制来存储每个租户的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';
    }