MySQL + PHP-查询相对格式日期

时间:2018-09-20 13:04:40

标签: php mysql laravel php-carbon

我有两个表:步骤流程

  • 步骤有很多流程。
  • 步骤具有relative_time(字符串)列。
  • 流具有active_on(可为空,时间戳)列。

步骤relative_time存储relative formats,其值类似于:“ + 1年”,“ + 2天”,“ + 30天”等。

active_on是在用户激活流时设置的,它看起来像是“ 2017-12-30 00:00:00”。

每次我想知道 flow 何时到期时,我都从数据库中选择它,然后在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 :(得分:2)

您可以在relative_time中存储天数,而不是php日期间隔。这样您可以查询:

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

这样,您将使所有流都过期。

实际上不需要更改数据库结构。您可以创建一个迁移,以将relative_time从dateinterval转换为天数(是一个字符串字段)。

/**
 * @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");        
}

然后您可以调整getExpiresAtAttribute:

script.inline: true
script.indexed: true
script.update: true
script.mapping: true
script.engine.groovy.file.aggs: true
script.engine.groovy.file.mapping: true
script.engine.groovy.file.search: true
script.engine.groovy.file.update: true
script.engine.groovy.file.plugin: true
script.engine.groovy.indexed.aggs: true
script.engine.groovy.indexed.mapping: true
script.engine.groovy.indexed.search: true
script.engine.groovy.indexed.update: true
script.engine.groovy.indexed.plugin: true
script.engine.groovy.inline.aggs: true
script.engine.groovy.inline.mapping: true
script.engine.groovy.inline.search: true
script.engine.groovy.inline.update: true
script.engine.groovy.inline.plugin: true