如何为数据库模型动态设置连接(thinkorm)

doit

问题描述

业务场景为一个主库,多个业务库,类似多租户场景,主库数据共享,之前使用tp框架时,使用的方案是针对每个请求生命周期,根据参数在中间件中动态设置默认数据库连接。主库模型指定连接,业务库模型不指定连接,会使用默认连接。请问在webman中该如何设计,避免模型需要指定数据库连接及无法使用模型中的事件?

为此你搜索到了哪些方案及不适用的原因

已搜索,无可用方案。

1141 5 3
5个回答

楚羽幽

1、可以新建一个基类模型,在顶级基类模型里面使用connection属性进行链接
2、可以直接Db::connection("plugin.配置文件")链接

  • doit 2022-10-19

    可能我没表述清除,需求是多个业务库字段一致公用模型,有没有什么方法避免使用Model::connection方法,直接使用模型

  • 不败少龙 2022-10-19

    在模型里面指定链接的数据库

  • hongshao 2022-10-19

    class User extends Model
    {
    protected $connection = 'website';

  • doit 2022-10-19

    多数据库共用模型,不能在模型里指定,需要根据业务动态切换连接

  • 不败少龙 2022-10-19

    难道是不同的模块调用模型对应的不同数据库?

  • nitron 2022-10-19

    Service层指定connection,再怎么动态最终都要指定连接

xiuwang
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();
    }
}
  • doit 2022-10-19

    实测,模型始终使用的是默认数据库连接,construct重置连接不起作用,使用模型User::connect('db')也不起作用

  • doit 2022-10-19

    已解决,十分感谢

  • 晚安。 2022-10-19

    怎么解决的

  • doit 2022-10-20

    使用了db门面测试发现,是配置的问题。。

2548a

ImBase实际连接的是im配置的数据库,为了测试我故意改成info配置的,你既然说重置没用,那我下面代码绝对会报数据表不存在的,然而刚我测试了,改了后他们一样正常运行。这说明重置$connection没有问题。
截图

  • doit 2022-10-19

    Model继承的是think\Model吗?

2548a

我直接贴图给你看
截图

  • 暂无评论
2548a

重置连接肯定没问题的,可能是你传参导致的,基类默认是传了个 $data 参数的,你使用Request->xxx 或者写一个静态类来传连接配置,不要像前面那样传参数看看。

年代过于久远,无法发表回答
🔝