ShelestovAnt
@ShelestovAnt
Верстаю и программирую

Отредактировать sql перед запросом в базу?

Всем привет!
Есть работающий проект на версии 5.8
Сейчас делаем глобальное обновление проекта, в том числе и laravel до последней версии.
В последней версии оказывается все подели для удобства перенесли в папку Models, раньше было в app/
И соответственное пространство имен немного поменялось с App\User на App\Models\User.

И того имеем что не работают полиморфные отношения т.к. теперь идет запрос к колонке model_type с данными App\Models\User, а в старой базе все сохранено App\User.

Вопрос: Можно ли как-то перед запросом в базу редактировать эти данные?
типа: str_replace('\Models', '', $className)

А потом, когда проект будет доделан и готов к паблику, обновить информацию в базе чтобы было как надо.

Спасибо!
  • Вопрос задан
  • 96 просмотров
Пригласить эксперта
Ответы на вопрос 2
@jazzus
Ничего не мешает оставить модель App\User
просто новые будут генерироваться в models
ну или DB::table('table')->update(['model_type' => 'App\Models\User'])
Ответ написан
pLavrenov
@pLavrenov
Разработка сайтов
Об этом надо изначально было позаботиться.

Вообще есть легкое решение проблемы добавить в AppServiceProvider::register() метод:
Relation::morphMap([
    'model' => Model::class,
]);


Где model - это имя которое было раньше (App\Models\User) а модель это собственно сама модель, но я сталкивался с некоторыми задачами когда надо было получить это название:

Например:
public function account()
{
    return $this->belongsTo(Account::class, 'target_id')->where('target_type', Account::$morphClass);
}


Я стал добавлять название прямо в модель:
public static $morphClass = 'account';

и получается так:

Relation::morphMap([
    Model::$morphClass => Model::class,
]);


Ссылка на документацию

В целом пока что можно указать название которые были, но по мере продвижения обновления лучше заменить и в базе эти название т.к длинные названия просто занимают больше места.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы