MySQL + PHP - запрос относительного формата даты - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть две таблицы: шагов и потоков .

  • шагов имеет много потоков.
  • шагов имеет relative_time (строка) столбца.
  • потоков имеет столбец active_on (обнуляемый, отметка времени).

Шаги relative_time хранят относительные форматы и их значения выглядят следующим образом:«+1 год», «+2 дня», «+30 дней» и т. Д.

Потоки active_on устанавливается, когда пользователь активирует поток, и выглядит так: «2017-12-3000:00:00 ".

Каждый раз, когда я хочу знать, когда истечет поток , я выбираю его из базы данных и в PHP (Laravel, Carbon ), Я выполняю:

/**
 * @return null|Carbon
 */
public function getExpiresAtAttribute() 
{
    if (!$this->active_on) {
        return null;
    }

    // Access the relative time for step (for example: "+3 days").
    $relativeTime = $this->step->relative_time;

    // Adds the limit time to the activation date,
    // turning it possible to check when the current flow
    // will "expires". 
    return $this->active_on->modify($relativeTime);        
}

Проблема

Легко проверить, истекает ли значение в PHP.Проблема в том, что теперь мне нужно выбрать только потоки, которые «просрочены» непосредственно из базы данных, и я не знаю, возможно ли это с помощью этого подхода.Как мне этого добиться?

1 Ответ

0 голосов
/ 20 сентября 2018

Вы можете хранить в относительном времени число дней вместо интервала дат php.Таким образом, вы можете запросить:

SELECT * FROM flows, steps WHERE flows.step_id = step.id AND NOW() > ADDDATE(flows.active_on, steps.relative_time)

Таким образом, вы получите все потоки с истекшим сроком действия.

Нет необходимости изменять структуру базы данных.Вы можете создать миграцию для преобразования относительного времени из dateinterval в число дней (это строковое поле).

foreach (Steps::all() as $step) {
    $step->update([
      'relative_time' => strtotime($step->relative_time,0)/(3600*24);
    ]);
}

Затем вы можете настроить getExpiresAtAttribute:

/**
 * @return null|Carbon
 */
public function getExpiresAtAttribute() 
{
    if (!$this->active_on) {
        return null;
    }

    // Access the relative time for step (for example: "+3 days").
    $relativeTime = $this->step->relative_time;

    // Adds the limit time to the activation date,
    // turning it possible to check when the current flow
    // will "expires". 
    return $this->active_on->modify("+$relativeTime days");        
}
...