gpt4 book ai didi

php - Laravel Session 检测到一个域、多个数据库

转载 作者:行者123 更新时间:2023-11-29 16:04:05 25 4
gpt4 key购买 nike

我已经阅读了一些关于 SaaS、 Multi-Tenancy 等主题的帖子/主题(例如 thisthisthis ),我得出的结论是,其中大多数不符合我的要求:

  1. 我不需要 Multi-Tenancy ,因为我只使用主域
  2. 我无法在 .env 或 database.config 中写入所有 MySQL 连接,因为它们都是动态的(至少是数据库的名称)

我需要的工作流程:

  1. 订阅 (SaaS) 包含数据库名称
  2. 每当用户登录时,都会将数据库名称分配给他的 session
  3. 对用户数据库运行所有查询

示例:

- project_admin <- Main database 
--- subscriptions <- Table
------ id | db_name
------ 1 | project_child_one
------ 2 | project_child_two
--- users <- Table
------ id | subscription_id
------ 1 | 1
------ 2 | 2

- project_child_one <- Child database
--- customers <- table

- project_child_two <- Child database
--- customers <- table
  • user 1登录时,从客户检索的数据应来自数据库project_child_one
  • 用户 2 登录时,从客户检索的数据应来自数据库 project_child_two

我希望将数据库名称保存在 session 中,这样我就不需要总是查询 project_admin 来了解用户应连接到哪个数据库。这是简单的部分。

最佳答案

如果您确实需要有一个“租户”数据库连接,那么您可以在中间件类中动态配置它:

class ConfigureTenantConnection
{
public function handle($request, Closure $next)
{
if ($user = $request->user()) {
// Create a tenant database connection if there is an authenticated user
config([
'database.connections.tenant' => [
'driver' => 'mysql',
// I don’t know what column names you use, but…
'host' => $user->database_host,
'port' => $user->database_port,
'database' => $user->database_name,
'username' => $user->database_username,
'password' => $user->database_password,
],
]);
}

return $next($request);
}
}

然后,您可以在数据库查询和模型中使用此租户连接:

abstract class TenantModel extends Model
{
protected $connection = 'tenant';
}
<小时/>
class Widget extends TenantModel
{
protected $table = 'widgets';
}

关于php - Laravel Session 检测到一个域、多个数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55908755/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com