我有类似B2B的应用程序,面临的挑战是我的每个客户都需要将其数据存储在不同的RDS中。我打算使用MySQL联合引擎来实现此目的,但是在创建本地表时,我们需要指定连接字符串,但是是否可以根据登录的用户更改这些连接字符串?我的意思是将每个用户的连接数据存储在本地数据库中,然后我们访问这些用户数据时需要将该连接字符串添加到联合表中,这可能吗?我正在使用Laravel和MySQL开发应用程序。
答案 0 :(得分:0)
这不能完全解决您的问题,但是除非有合法的理由将事情保存在单独的数据库中,否则我将尽量不要这样做。您可以使用全局范围和tenant_ids限制用户看到的内容。
在用户模型上,您将添加一个tenant_id
列,然后在所有模型上使用全局范围:
class TenantScope implements Scope
{
public function apply(Builder $builder, Model $model)
{
$builder->where('tenant_id', \Auth::user()->tenant_id);
}
}
class Widget extends Model {
protected static function boot()
{
parent::boot();
static::addGlobalScope(new TenantScope);
}
}
这样,每当用户访问模型时,他们只会收到分配给他们的模型。维护单独的数据库存在很多麻烦(迁移,无法全局查询等),因此,如果可以避免的话,应该这样做。
这是有关即时更改连接的另一个问题,如果您必须这样做,可能会有所帮助:Laravel Change Connection Dynamically