Laravel动态数据库连接

时间:2018-02-06 18:58:56

标签: php laravel laravel-5

我将在后端使用动态数据库连接。

    // ReadFile function variables
    static const DWORD bufferSize = 50;
    WCHAR buffer[bufferSize+1];  // Leave room for null.
    DWORD bytesWritten = 0;

    //-----------------------------------------------------------------
    // Reading data from file
    if (!ReadFile(
        hSourceFile,
        buffer,
        bufferSize*sizeof(WCHAR),
        &bytesWritten,
        NULL))
    {
        wprintf(L"Error code: %u\n", GetLastError());
        return 1;
    }
    buffer[bytesWritten/sizeof(WCHAR)] = 0; // Null terminate.
    wprintf(L"%s. \n", buffer);  // Look ma!  No cast needed.

如您所见,我必须在每次请求时更改db config以使用动态数据库连接。 如果存在具有不同数据库连接的并发请求,那么我该如何处理这些请求和连接?

请帮帮我。

2 个答案:

答案 0 :(得分:0)

documentation适用于很多情况,但是,我发现在很多情况下在中间件中设置连接会更方便。这更适合多租户类型的应用,但它可能对您有用:

public function handle($request, Closure $next)
{
    // if a user belongs to an organization, company, team, etc.
    // and each having their own database with a DSN stored in the database.

    if (auth()->check() && auth()->user()->company->active) {
        $uuid = $request->user()->company->db_uuid;
        $host = $request->user()->company->db_host;

        // here you can merge additional connection info in, such
        // as a master password from .env, for example
        $password = config('database.customer.master');

        // then set the default connection or assign a new one
        config(['database.connections.customer' => [
            'host' => $host,
            'password' => $password,
            'database' => $uuid,
            'username' => 'customer_master'
        ]]);

        return $next($request);
    }

    abort(403, 'Unauthorized');
}

请求生命周期中的每个查询都将使用该连接,而无需每次都设置连接。

大多数模型都是针对客户需求的,所以我们在基本模型中设置数据库连接,并在需要的地方继承。

class BaseModel extends Model
{
    public function __construct($attributes = []) {
          parent::__construct($attributes);

          $this->connection = config('database.connections.customer');
     }
}

答案 1 :(得分:0)

除非通过文件本身或.env。

进行更改,否则应用程序的配置是静态的

如果您希望按用户分隔数据库,则可以在会话中存储连接名称。

一个例子:

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

在登录操作中,您应设置会话:session(['databaseName' => 'secondDatabase']);

确保您的database.php中有一个名为'secondDatabase'的连接。