业务场景为一个主库,多个业务库,类似多租户场景,主库数据共享,之前使用tp框架时,使用的方案是针对每个请求生命周期,根据参数在中间件中动态设置默认数据库连接。主库模型指定连接,业务库模型不指定连接,会使用默认连接。请问在webman中该如何设计,避免模型需要指定数据库连接及无法使用模型中的事件?
已搜索,无可用方案。
1、可以新建一个基类模型,在顶级基类模型里面使用connection属性进行链接 2、可以直接Db::connection("plugin.配置文件")链接
可能我没表述清除,需求是多个业务库字段一致公用模型,有没有什么方法避免使用Model::connection方法,直接使用模型
在模型里面指定链接的数据库
class User extends Model { protected $connection = 'website';
多数据库共用模型,不能在模型里指定,需要根据业务动态切换连接
难道是不同的模块调用模型对应的不同数据库?
Service层指定connection,再怎么动态最终都要指定连接
class User extends Model { protected $connection; public function construct($connection) { $this->$connection = $connection; parent::construct(); } }
用的时候指定连接
$model = new User('website');
更进一步,你可以在中间件里给$request设置一个临时属性存储当前connection连接名,例如
$request->connectionName = 'website';
实例化的时候
$model = new User($request->connectionName);
再进一步,modle可以这样写
class User extends Model { protected $connection; public function construct() { $this->$connection = request()->connectionName; parent::construct(); } }
实测,模型始终使用的是默认数据库连接,construct重置连接不起作用,使用模型User::connect('db')也不起作用
已解决,十分感谢
怎么解决的
使用了db门面测试发现,是配置的问题。。
ImBase实际连接的是im配置的数据库,为了测试我故意改成info配置的,你既然说重置没用,那我下面代码绝对会报数据表不存在的,然而刚我测试了,改了后他们一样正常运行。这说明重置$connection没有问题。
Model继承的是think\Model吗?
我直接贴图给你看
重置连接肯定没问题的,可能是你传参导致的,基类默认是传了个 $data 参数的,你使用Request->xxx 或者写一个静态类来传连接配置,不要像前面那样传参数看看。
ok,已经搞定
感谢~
1、可以新建一个基类模型,在顶级基类模型里面使用connection属性进行链接
2、可以直接Db::connection("plugin.配置文件")链接
可能我没表述清除,需求是多个业务库字段一致公用模型,有没有什么方法避免使用Model::connection方法,直接使用模型
在模型里面指定链接的数据库
class User extends Model
{
protected $connection = 'website';
多数据库共用模型,不能在模型里指定,需要根据业务动态切换连接
难道是不同的模块调用模型对应的不同数据库?
Service层指定connection,再怎么动态最终都要指定连接
用的时候指定连接
更进一步,你可以在中间件里给$request设置一个临时属性存储当前connection连接名,例如
实例化的时候
再进一步,modle可以这样写
实测,模型始终使用的是默认数据库连接,construct重置连接不起作用,使用模型User::connect('db')也不起作用
已解决,十分感谢
怎么解决的
使用了db门面测试发现,是配置的问题。。
ImBase实际连接的是im配置的数据库,为了测试我故意改成info配置的,你既然说重置没用,那我下面代码绝对会报数据表不存在的,然而刚我测试了,改了后他们一样正常运行。这说明重置$connection没有问题。
Model继承的是think\Model吗?
我直接贴图给你看
重置连接肯定没问题的,可能是你传参导致的,基类默认是传了个 $data 参数的,你使用Request->xxx 或者写一个静态类来传连接配置,不要像前面那样传参数看看。
ok,已经搞定
感谢~