当我将数据库连接从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'
);
}
我知道我只能在构造函数或方法中使用依赖注入,在这种情况下,我没有构造函数,也不知道如何使用构造函数注入(因为它们都是抽象类和我的模型应该扩展库类,而不仅仅是调用它的特殊方法),那肯定是行不通的。
任何人都有解决方案吗?
答案 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 。