【问题标题】:laravel 5.4 dynamic database connectionlaravel 5.4 动态数据库连接
【发布时间】:2017-08-15 23:03:39
【问题描述】:

我正在 laravel 中构建准入门户,

我有一个超级管理员数据库,它有一个 100 行的学校表, 学校表结构 1.id 2.school_name 3.数据库详情

我想通过 id 连接到学校数据库及其数据库详细信息。

技术上 1.我将通过url传递学校ID 2.它将从学校表中选择该行 3.选择特定学校的数据库详细信息后 4.将连接到学校数据库以供进一步使用。

我通过https://laracasts.com/discuss/channels/tips/set-up-dynamic-database-connection-globally http://fideloper.com/laravel-multiple-database-connections 但没有运气

请帮忙整理一下。

【问题讨论】:

  • 没有运气是什么意思?你尝试的结果如何?

标签: php mysql database laravel dynamic


【解决方案1】:

实际上你不想要多个连接,而是改变现有的连接。

public function setSchoolConnection($id) {
    $school = School::find($id);

    if ( $school ) {
        config(['database.mysql' => [
            'database' => $school->database,
            'username' => $school->username,
            'password' => $school->password
         ]]);
    }
}

现在默认连接已更改。我想。

如果你不想改变现有的连接,只需创建一个新的连接

config(['database.school' => [
    'driver'   => 'mysql',
    'database' => $school->database,
    'username' => $school->username,
    'password' => $school->password
]]);

并像这样使用它

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

【讨论】:

  • 但是如果我采用这种方式,我需要为每个路由请求建立连接,这意味着需要在每个控制器的每个函数中编写相同的代码,我不想这样做
  • 如果你不这样走,那么你需要手动将路由添加到配置中。您可以将其添加到中间件中。因此,对于每个请求,学校都会使用正确的数据库。现在,这完全取决于您。
【解决方案2】:

您是否尝试过在 School 模型中设置连接? Laravel 会处理剩下的事情,即使你有不同的连接。

在您的 School 模型中,我将像这样覆盖构造函数:

public function __construct(array $attributes = [])
{
    $this->setConnection(env('DB_SCHOOL_CONNECTION'));

    parent::__construct($attributes);
}

要注意的一件事是,如果您与不同的连接有关系,则在查询/构建器中使用 whereHashas 将不起作用。因为 laravel 将无法在生成的查询中设置连接。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-05
    • 1970-01-01
    • 1970-01-01
    • 2016-11-11
    • 1970-01-01
    • 2017-10-03
    • 2021-04-30
    相关资源
    最近更新 更多