【问题标题】:Laravel 5.3 Carbon date format is not set on return?Laravel 5.3 Carbon 日期格式未在返回时设置?
【发布时间】:2016-11-04 12:04:00
【问题描述】:

我有我的 VitalSignSet 模型:

class VitalSignSet extends Model
{
  protected $dates = [
        'datetimetaken',
  ];

  . . .
}

现在在我的函数中,我有这个函数,它返回与最新生命体征集的 json 编码遭遇。 (遇到与 VitalSignSet 有 hasMany 关系)虽然在返回之前,我希望将 datetimetaken 字段格式化为人类可读性,但仅适用于这种特定方法。 (这就是我没有使用访问器的原因)

public function get(Request $request, Encounter $encounter) {
   // Setting the latest vital sign set
   $encounter->latest_vitals = $encounter->VitalSignSets()
             ->orderBy('datetimetaken','desc')->get()->first();

   // Formatting the date :
   // Works when just returning the date.
   // Does not return in this format when returning the model with the date.
   $encounter->lastest_vitals->datetimetaken->format('M j, Y');

   return $encounter->toJson();
}

上面的方法是从一个js ajax请求中访问的。当我解析并记录响应时,datetimetaken 格式没有改变。 (仍然是YYYY-mm-dd H:i:s 格式)但是当我在格式化后只返回$encounter->latest_vitals->datetimetaken; 时,会以我设置的格式返回一个字符串。但是当我返回包含 VitalSignSet 模型$encounter->latest_vitals;(json 响应)时,格式为YYYY-mm-dd。这是为什么呢?

【问题讨论】:

    标签: php laravel-5.3 php-carbon


    【解决方案1】:

    这是因为您只是在访问数据对象,并没有真正改变它。

    不幸的是,没有办法(我已经找到)编辑模型中Carbon 实例的格式。这是因为 Laravel 从数据库中解析日期时间的格式与将其格式化为字符串时使用的格式相同。

    此外,您不能只将格式化字符串分配给原始字符串,因为 Eloquent 会尝试解析该字符串(并失败)。

    一种方法(如果您希望/需要将键保留为datetime)是将输出转换为数组,编辑值,然后返回:

    $latestVitals = $encounter->VitalSignSets()
        ->orderBy('datetimetaken', 'desc')->first();
    
    $encounter->latest_vitals = collect($latestVitals->toArray())
        ->pipe(function ($item) use ($latestVitals) {
            $item['datetimetaken'] = $latestVitals->datetimetaken->format('M j, Y');
    
            return $item;
        });
    
    return $encounter;
    

    如果您不介意将密钥更改为其他内容(例如 formatted_datetimetaken),您可以为 VitalSignSet 使用的模型添加访问器:

    public function getFormattedDatetimetakenAttribute()
    {
        return $this->datetimetaken->format('M j, Y');
    }
    

    然后只需使用append()

    $encounter->latest_vitals = $encounter->VitalSignSets()
        ->orderBy('datetimetaken','desc')
        ->first()->append('formatted_datetimetaken');
    

    最后,你可以简单地在你的 js 中编辑日期时间,比如http://momentjs.com/docs。假设您的响应分配给变量response

    response.latest_vitals.datetimetaken = moment(response.latest_vitals.datetimetaken, "YYYY-MM-DD HH:mm:ss")
                .format("MMM D, YYYY")
    

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 2016-12-01
      • 2021-11-30
      • 2018-04-20
      • 2016-02-28
      • 1970-01-01
      • 2018-03-13
      • 2023-02-07
      • 2016-03-24
      • 2017-04-21
      相关资源
      最近更新 更多