当我将数据库连接从 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/