【问题标题】:Laravel 5.6 change database connection in the runtime permanentlyLaravel 5.6 在运行时永久更改数据库连接
【发布时间】:2018-08-08 13:09:41
【问题描述】:

我有两个数据库。第二个数据库是动态变化的,即每个客户端都有自己的数据库,因此数据库名称和密码不同,但所有客户端的架构都是相同的。所以我有两个模型组,第一个用于第一个数据库,第二个用于第二个数据库。实际上,第二个模型组必须能够查询客户端数据库而不是默认数据库

所以我想动态设置默认数据库连接。Config::Set() 将只为一个请求执行此操作。我希望它用于后续的每个请求。

我使用 Laravel 框架,你知道一个干净的解决方案可以解决我的问题并帮助其他感兴趣的人

感谢大家的帮助

【问题讨论】:

  • 您可以更新config的值。 laravel.com/docs/5.6/… 或将其写入文件并访问它。
  • 一种方法是多次部署应用程序并为每个客户端保留单独的.env 文件。对于一个模型组,在每个模型上使用第二组的默认连接将protected $connection = 'seconddb'; 并不断更改seconddb 的连接参数在.env 文件中。缺点是不同的域/子域
  • @SougataBose 是的,我设置了配置,它只会为一个请求执行。
  • @MichalBieda 我也有同样的想法,但这不是一个好的解决方案,因为如果我有很多客户,我应该做很多操作,想象一下如果我必须更新应用程序,我会花很多时间很多时间
  • 我建议您阅读以下Laravel doc 以了解请求的工作原理。 laravel.com/docs/5.6/lifecycle

标签: php mysql database laravel laravel-5.6


【解决方案1】:

config/database.php中创建两个条目:

'connections' => array(

    # Connection one
    'mysql_1' => array(
        'driver'    => 'mysql_1',
        'host'      => 'host_1',
        'database'  => 'db_1',
        'username'  => 'username_1',
        'password'  => 'password_1'
        'charset'   => 'utf8',
        'collation' => 'utf8_unicode_ci',
        'prefix'    => '',
    ),

    # Connection two
    'mysql_2' => array(
        'driver'    => 'mysql_2',
        'host'      => 'host_2',
        'database'  => 'db_2',
        'username'  => 'username_2',
        'password'  => 'password_2'
        'charset'   => 'utf8',
        'collation' => 'utf8_unicode_ci',
        'prefix'    => '',
    ),
),

为在模型级别设置连接的每组模型创建一个基本模型或特征。将所有模型更改为从它们各自的基本模型扩展。

基础模型

class BaseGroupOneModel extends Model
{
    protected $connection = 'mysql_1';
}

class BaseGroupTwoModel extends Model
{
    protected $connection = 'mysql_2';
}

特征

trait GroupOneTrait
{
    protected $connection = 'mysql_1';
}

trait GroupTwoTrait
{
    protected $connection = 'mysql_2';
}

class GroupOneModel extends Model
{
    use app/Models/Traits/GroupOneTrait;
}

class GroupTwoModel extends Model
{
    use app/Models/Traits/GroupTwoTrait;
}

【讨论】:

  • 另外,您可以使用Middleware 来检测您的客户端并根据需要使用config() 助手更改数据库连接。 config()->set('database.default', yourconnectionname);
  • @Pusparaj 我正在尝试实施此解决方案 [github.com/uxweb/laravel-multi-db]
  • 解决方案是你给我的很酷,但你没有考虑到每个用户的第二个模型组的连接名称都会改变
  • 创建中间件,根据登录用户(或根据您的要求)应用逻辑检测连接名称,并通过 Kernel.php 将新中间件添加到所有路由
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-07
  • 1970-01-01
  • 1970-01-01
  • 2020-08-19
  • 2017-12-26
  • 2021-09-11
  • 1970-01-01
相关资源
最近更新 更多