Как изменить время зоме в разных таблицах в Laravel - PullRequest
0 голосов
/ 11 марта 2020

Можете ли вы дать идею? У меня есть две таблицы в postgresql БД. Они заполнены записями двух отдельных файлов CSV. Но записи первого CSV-файла с локальной меткой времени. Второй CSV-файл с временными метками UT C. Поэтому мне нужно изменить местное время представления в этой таблице, которое заполнено записями с часовым поясом UT C. Я имел обыкновение иметь дело с этой проблемой перед использованием laravel с этим кодом на каждой странице, которая мне нужна для этого, например:

date_default_timezone_set('Europe/Sofia');

Контроллер:

      function getdata_chart(Request $request)
      {
        $start_date = date('d-m-Y 00:00:00');
        $end_date = date('d-m-Y 23:59:59');
        if($request->start_date != '' && $request->end_date != '')
        {
          // if user fill dates
          $dateScope = array($request->start_date ." 00:00:00", $request->end_date ." 23:59:59");
        } else {
          // default load page - today
          $dateScope = array($start_date, $end_date);
        };
        $students = MeasCanal::whereBetween('recordtime', $dateScope)
      ->selectRaw('recordtime')
      ->selectRaw('max(formattedvalue) filter (where fullname = \'Данни.Кота\') as iazovir')
      ->selectRaw('max(formattedvalue) filter (where fullname = \'Данни.Температура\') as temperatura350')
      ->where(function ($query) {
        $query->where('fullname', 'like', "Язовир.Данни.Кота")
              ->orWhere('fullname', 'like', "ГСК_11_350.Данни.Температура");
      })
      ->groupBy('recordtime')
      ->orderBy('recordtime')
      ->get();

        return response()->json($students);

      }
    return response()->json($students);
}

Ответы [ 2 ]

1 голос
/ 11 марта 2020

Обновите вашу модель MeasCanal и добавьте следующее:

Импорт и использование:

use Carbon\Carbon;

Добавление функции:

/**
     * Get the user's recordtime.
     *
     * @param  string  $value
     * @return string
     */
    public function getRecordtimeAttribute($value)
    {
            return Carbon::parse($value)->timezone('Europe/Sofia')->toDateTimeString();

    }
1 голос
/ 11 марта 2020

Я не уверен, что это то, что вы хотите, но я думаю, что вы можете понять идею.

Первый метод,

Вы можете использовать аксессор ;

public function getCustomTimestampAttribute($value)
{
    // you can use your logic here to set your timezone by table
    $timezone = 'Europe/Sofia';
    return Carbon::parse($this->custom_timestamp)->timezone($timezone)->toDateTimeString();
}

затем вы можете получить значение, например: $model->custom_timestamp

Второй метод,

Вы можете использовать map ;

$customDates = $dates->map(function ($date, $key) {
    $date->custom_timestamp = Carbon::parse($date->custom_timestamp)->timezone('Europe/Sofia')->toDateTimeString();
    return $date;
});

EDIT

В вашей модели (MeasCanal) установите атрибут рекордного времени;

public function getRecordtimeAttribute($value)
{
    // you can use your logic here to set your timezone by table
    $timezone = 'Europe/Sofia';
    return Carbon::parse($this->recordtime)->timezone($timezone)->toDateTimeString();
}

, тогда вы можете просто посмотрите результат после запроса в вашем контроллере, например

dd($students);

или еще проще:

dd($students->first()->recordtime); // first matched rows recordtime attr.

Примечание: вы не можете использовать методы доступа с необработанными запросами, вам следует использовать красноречивые модели между прочим.

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