求实现思路
客户希望把现有系统改造为多租户系统,每个租户有各自的数据库和二级域名
用户登录不同域名使用对应的数据库已经解决。
现有问题是,当租户注册完成后,我创建了数据库并且,根据租户填写的信息在更新响应的表,比如用户名,密码,城市,地址等,
现在的做法是创建一个command,然后注册成功后再调用这个命令
部分代码
$signature = 'tenant:seed {name} {password} {email} {verify_token}';
public function handle()
{
// https://stackoverflow.com/questions/21307464/can-i-import-a-mysql-dump-to-a-laravel-migration
$companyName = $this->argument('name');
$email = $this->argument('email');
$verifyToken = $this->argument('verify_token');
$dbname = config('tenant.db_prefix') . $companyName;
$cryPassword = bcrypt($this->argument('password'));
DB::unprepared("CREATE DATABASE `$dbname` DEFAULT CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI;");
DB::unprepared("USE $dbname;");
DB::unprepared(file_get_contents(storage_path('sql/tenant20200928.sql')));
DB::unprepared("update Employee set empName='$companyName', email='$email', empEmail='$email', empPassword = '$cryPassword', verify_token = '$verifyToken' where empNr = 1 limit 1");
}
目前问题是创建数据库速度有点慢,有些字段还需要更新其他表,比如地址,城市,老是往命令行传参数也是好办法,求更好思路,谢谢
为什么每个租户都要一个数据库,不能都在一个数据库中吗
创建数据库不可能慢的,除非你进行了导入大量数据。有几个思路可供你参考: 1、如果你每次导入的都是一些模板数据,都是一样的话,可以采用预导入方式,平时弄个任务先导好几个库备用,自己维护一个数据库使用对应关系表,每次新用户使用的时候,直接从备用库拿就好了。 2、导入大量数据的话,php单线程执行比较慢,可以使用多线程导入,php实现起来比较繁琐,这块可以采用其他语言
事件系统《Laravel 7 中文文档》
这个更适合
每传建一个用户都有一个自己的二级域名是怎么实现的?
我记得有一个插件,完美的支持你这个功能吧;
github.com/tenancy/multi-tenant
不建议分开库,真的维护起来太费劲了。单库虽然大。但是维护简单啊。备份简单。目前我也是多租户,单库解决。主要是看用户业务逻辑是否一致。
我目前已经实现你说的功能了,确实,现在创建 租户的时候有点慢,大概10几秒。因为调用migration 还要调用各种seeder
不能异步的方式吗?先把主要逻辑同步做完,然后丢个消息队列去异步处理