Как автоматизировать изменение базы данных с mysql на mongodb в laravel - PullRequest
0 голосов
/ 23 февраля 2019

Я хочу автоматизировать зависимости базы данных при изменении соединения с базой данных с 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'
        );
}

Iзнаю, что я могу использовать инъекцию зависимостей только в конструктор или метод, и в этом случае у меня нет конструктора, и я не знаю, как использовать инъекцию конструктора для него (потому что оба они являются абстрактным классом, и мои модели должны расширять библиотечный классне просто называть это специальными методами), тогда это определенно не будет работать.

Есть ли у какого-нибудь тела решение?

1 Ответ

0 голосов
/ 24 февраля 2019

Я сам нашел ответ, и я поделюсь с ним решением, у других людей возникнет тот же вопрос:

first , вам нужно определить Alise Class (например,: DBModel) в config / app.php:

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

]

, затем , вы должны наследовать все модели, для которых вы хотите иметь динамическое соединение:

в классе моделей:

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

наконец , в вашем сервис-провайдере при загрузке добавьте эти коды:

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);
}

не забудьте использовать Осветить \ Основание \AliasLoader поверх файла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...