Laravel - 如何在数据库连接字符串中设置附加参数?

Laravel - How to set additional parameters in database connection string?

我目前正在将遗留系统迁移到 laravel 并且 我在连接到数据库时遇到有关使用其他参数的问题。

以下是当前代码:

try {
    $dns = "pgsql:host=<HOST>;port=<NUMBER_PORT>;dbname=<DB_NAME>";
    $options = [PDO::ATTR_PERSISTENT => true];
    $this->driver = new PDO($dns, <DB_USERNAME>, <DB_PASSWORD>, $options);
    
    $this->driver->query("SET app.current_tenant = {<TENANT_ID>}");
    $this->driver->query("SET app.current_institution = {<INSTITUTION_ID>}");

    $this->driver->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
    echo $e->getMessage();
}

我的问题是:如何设置app.current_tenantapp.current_institution连接数据库时的参数Laravel.

实现此目的的一种方法是实现您自己的数据库连接 class,覆盖 connect() 方法来执行您想要的操作。在最基本的层面上,这可能看起来像这样:

app/Database/PostgresConnector.php

<?php

namespace App\Database;

use Illuminate\Database\Connectors\PostgresConnector as BaseConnector;

class PostgresConnector extends BaseConnector
{
    public function connect(array $config)
    {
        $pdo = parent::connect($config);
        $pdo->query("SET app.current_tenant = {<TENANT_ID>}");
        $pdo->query("SET app.current_institution = {<INSTITUTION_ID>}");

        return $pdo;
    }
}

然后您可以编写一个服务提供程序来使用您的自定义连接器而不是默认连接器。 app/Providers/DatabaseConnectorProvider.php

<?php

namespace App\Providers;

use App\Database\PostgresConnector;
use Illuminate\Support\ServiceProvider;

class DatabaseConnectorProvider extends ServiceProvider
{
    public function register()
    {
        $this->app->bind('db.connector.pgsql', PostgresConnector::class);
    }
}

最后,确保您的服务提供商已加载到 config/app.php 的提供商数组中。