【问题标题】:How to automatize database changing from mysql to mongodb in laravel如何在 laravel 中自动将数据库从 mysql 更改为 mongodb
【发布时间】:2019-07-17 05:54:55
【问题描述】:

当我将数据库连接从 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'
        );
}

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

任何机构都有解决方案吗?

【问题讨论】:

  • 你能告诉我们错误吗?顺便说一句,您不使用装饰器模式,而是使用策略模式。
  • 它说:vendor\laravel\framework\src\Illuminate\Database\Connection.php:在 null 上调用成员函数 prepare(),因为模型没有从库模型继承它导致这个错误。 @DjellalMohamedAniss

标签: database mongodb laravel dependency-injection


【解决方案1】:

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

首先,你必须在config/app.php中定义Alise Class(例如: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

【讨论】:

    猜你喜欢
    • 2021-06-07
    • 2018-08-05
    • 1970-01-01
    • 1970-01-01
    • 2021-10-01
    • 2011-07-18
    • 2011-09-30
    • 2016-11-18
    • 2020-02-20
    相关资源
    最近更新 更多