Автоматическое преобразование часового пояса Mysql и обратно в моделях Laravel 5 - PullRequest
0 голосов
/ 07 апреля 2019

Я занимаюсь разработкой приложения Laravel 5.8, которое подключается к 2 базам данных.Одна - это собственная база данных приложения, а другая - устаревшая база данных MySQL.К сожалению, устаревшая база данных хранит даты как «Европа / Лондон», а не как UTC.

Есть ли хороший способ автоматической адаптации дат «Европа / Лондон» к «UTC» в моих моделях Laravel?

Я видел, что вы можете добавить 'timezone'=>'+01:00' к соединению в 'config / database.php', но это никак не влияет.И я не хочу устанавливать часовой пояс приложений по умолчанию в «config / app.php», потому что это повлияет на собственную базу данных приложения, которая должна быть UTC.

Если база данных содержит «2019-04-01 13: 00: 00 ', я бы хотел, чтобы $model->created_at возвращал' 2019-04-01 12:00:00 '(эквивалент UTC) по умолчанию.Аналогичным образом, если я сделаю $model->created_at = '2019-04-01 12:00:00'; $model->save(), следует сохранить в базе данных значение «2019-04-01 13:00:00».

Может ли кто-нибудь помочь?Я начинаю думать, что мне придется сделать кучу аксессоров и мутаторов для всех моих столбцов даты и времени, что кажется большой работой.

1 Ответ

0 голосов
/ 07 апреля 2019

В конце я использовал getAttribute и setAttribute

public function getAttribute($key){
        $value = parent::getAttribute($key);

        if(in_array($key, $this->dates)){
            $localDateTime = new \Carbon\Carbon(parent::asDateTime($value), 'Europe/London');
            $localDateTime->setTimezone('UTC');
            return $localDateTime;
        }
        else 
        {
            return $value;
        }
    }


    public function setAttribute($key, $value){
        if(in_array($key, $this->dates) && $value !== null){
            $value = new \Carbon\Carbon(parent::asDateTime($value), 'UTC');
            $value->setTimezone('Europe/London');
        }

        parent::setAttribute($key, $value);
    }

Я буду помещать это в BaseModel или черту.Также «Европа / Лондон» будет в конфигурационном файле.

Кажется, работает нормально.Стыд не существует в пути (что я знаю).

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