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

标签 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'
        );
}

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

有没有人有解决方案?

最佳答案

我发现它是我自己的答案,我分享它的解决方案,因为其他人也会有同样的问题:

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

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

]

然后,你必须继承所有你想要动态连接的模型:

在模型类中:

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

最后,在你的 serviceProvider at boot 函数中添加这些代码:

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

关于database - 如何在 laravel 中自动将数据库从 mysql 更改为 mongodb,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54838919/

相关文章:

javascript - 如何在aws lambda函数中使用setInterval

java - MongoDB Java驱动程序更新了不匹配的子文档

sql - DBMS 上下文中的 BLOB 到底是什么

java - 玩!框架 - 无法连接到数据库

javascript - 我如何在 MongoDB 中伪造一个多项目 $pop?

Laravel Socialite 与 Google 保存不同的 ID 号,导致重复错误

javascript - laravel 中的 Jquery 变量到 php 变量

php - 拉拉维尔。模型厂。多对多关系

mysql - MySql说:无法连接:无效的设置等等

ruby-on-rails - 基础数据库关联