如何在laravel中自动将数据库从mysql更改为mongodb

时间:2019-02-23 06:31:45

标签: database mongodb laravel dependency-injection

当我将数据库连接从Mysql更改为Mongodb时,我想使数据库依赖关系自动化。

我正在将https://github.com/jenssegers/laravel-mongodb用于laravel mongodb数据库,要使用该库,我应该从特定模型中扩展模型, 我想在运行时将数据库连接从mysql更改为mongodb,并且在更改数据库时,其依赖关系(例如,扩展其模型)将自动完成。

这是laravel模型的实现:

abstract class Model implements ArrayAccess, Arrayable, Jsonable, 
JsonSerializable, QueueableEntity, UrlRoutable {
  it's codes .... 
}

这是库模型的实现:

abstract class Model extends BaseModel {
   it's codes .... 
}

我将这些代码添加到RouteServiceProvider.php中,以替换库模型而不是laravel模型:

if (config('database.default') == 'mongodb') {
       $this->app->bind(
            'Illuminate\Database\Eloquent\Model',
            'Jenssegers\Mongodb\Eloquent\Model'
        );
}

我知道我只能在构造函数或方法中使用依赖注入,在这种情况下,我没有构造函数,也不知道如何使用构造函数注入(因为它们都是抽象类和我的模型应该扩展库类,而不仅仅是调用它的特殊方法),那肯定是行不通的。

任何人都有解决方案吗?

1 个答案:

答案 0 :(得分:0)

我发现这是我自己的答案,我也分享了它的解决方案,其他人也会遇到同样的问题:

首先,您必须在config / app.php中定义 Alise类(例如:DBModel):

'aliases'=> [
    ...
    'DBModel' => ''

]

然后,您必须继承要建立动态连接的所有模型:

在模型类中:

use DBModel ;
class Comment extends DBModel {
...
}

最终,在启动功能的serviceProvider中添加以下代码:

if (config('database.default') == 'mysql') {
   $loader = AliasLoader::getInstance();
   $loader->alias('DBModel', \Illuminate\Database\Eloquent\Model::class);
} else if (config('database.default') == 'mongodb') {
  $loader = AliasLoader::getInstance();
  $loader->alias('DBModel', \Jenssegers\Mongodb\Eloquent\Model::class);
}

不要忘记在文件顶部使用 Illuminate \ Foundation \ AliasLoader