最近我正在开发一个店铺管理系统,每个店铺都有自己的数据库。用户在登录后可以从会话访问数据库连接。但是我不能自己建立这个系统。
发布于 2020-11-09 03:31:55
在运行时更改连接的一种方法是通过配置设置值:
config(['database.connections.mysql_new_connection' => [
'driver' => 'mysql',
'host' => env('DB_HOST', 'localhost'),
'database' => env('DB_DATABASE', 'database_name'),
'username' => env('DB_USERNAME', 'user_name'),
'password' => env('DB_PASSWORD', 'password'),
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci'
]]);然后,您可以通过DB facade指定一个连接:
DB::connection('mysql_new_connection')->select('');发布于 2020-11-09 07:44:17
对于类似的应用程序,我有一个租户数据库和表,我在其中存储每个租户的子域和连接数据。
然后,我构建了一个中间件,如下所示:
<?php
namespace App\Http\Middleware;
use Config;
use Closure;
use App\Models\Tenant;
class SubdomainSetup
{
public function handle($request, Closure $next)
{
$subdomain = $request->server()['HTTP_HOST'];
$tenant = Tenant::where('subdomain', $subdomain)->firstOrFail();
config([
'database.connections.mysql.tenantid' => $tenant->tenantid,
'database.connections.mysql.host' => $tenant->host,
'database.connections.mysql.database' => $tenant->database,
'database.connections.mysql.username' => $tenant->username,
'database.connections.mysql.password' => $tenant->password,
]);
return $next($request);
}
}并将其添加到我的全局Kernel.php中
protected $middleware = [
.....
\App\Http\Middleware\SubdomainSetup::class,
];所以每个请求首先要经过这个设置。这样,您就可以根据子域名透明地设置连接。
简单,干净和安全。
https://stackoverflow.com/questions/64742176
复制相似问题