MySQL数据库以Y-m-d H:i:s
存储时间,即2000-12-32 00:00:00
格式,UTC。
我想知道是否有某种方法可以转换从数据库返回的$order
对象的created_at-dateTime属性,因此它会向客户端发送一个dateTime
字符串,如下所示:31/04/16 14:25pm
,不带秒。
for($i = 0; $i < sizeof($orders); $i++ ) {
$orders[$i]->created_at = $orders[$i]->created_at->format('d/m/y H:i');
}
欢迎使用访问器和突变体:
使用Laravel的正确方法是定义访问器:当Eloquent试图检索字段的值时,它将自动调用访问器。这意味着您不必在一组对象上循环,然后转换值,只需在模型中定义Accessor即可。
解决方案1:
因此,对于您的日期字段,请在Orders Model
中添加以下方法
public function getCreatedAtAttribute($value)
{
return $value->format('d/m/y H:i a');
}
访问器的名称应该是getFieldAttribute
,您可以将字段替换为相应的列名。这样你就不必在结果上循环了。
注:请记住,通过这样做,您现在将created_at作为一个字符串,而不是模型中的Carbon对象,那么这会对您产生什么影响呢?如果您在其他地方进行比较,您也可以使用Mutator在Accessor上设置更多字段值,并且可以在此处找到Mutatorhttps://laravel.com/docs/5.1/eloquent-mutators
解决方案2:
是的,基本上在所有数组上循环并进行转换。
for($i = 0; $i < count($orders); $i++ ) {
$orders[$i]->created_at = $orders[$i]->created_at->format('d/m/y H:i a');
}
更新:
如果遇到诸如"找不到分隔符号"或"找到意外数据"之类的错误调整解决方案如下:
解决方案#1:
public function getCreatedAtAttribute($value)
{
return Carbon'Carbon::createFromFormat('Y-m-d H:i:s', $value->toDateTimeString())->format('d/m/y H:i a');
}
解决方案2:
for($i = 0; $i < count($orders); $i++ ) {
$orders[$i]->created_at = Carbon'Carbon::createFromFormat('Y-m-d H:i:s', $orders[$i]->created_at->toDateTimeString())->format('d/m/y H:i a');
}
你是对的,你可以格式化created_at time
foreach($orders as $order){
echo $order->created_at->format('d/m/y H:i a');
}
假设$orders
是一个有说服力的模型,created_at
和updated_at
属性将自动转换为carbon实例,因此您已经可以在它们上运行carbon方法。
请参阅有关此主题的文档:https://laravel.com/docs/5.2/eloquent-mutators#date-突变
所以,你的代码:
$orders[$i]->created_at->format('d/m/y H:i');
应该工作得很好!
您可以在Order
模型中添加一个helper方法,使其可读性更强,类似于以下内容:
public function createdAtTimeStamp()
{
return $this->created_at->format('d/m/y H:i');
}
然后你可以这样访问它:
$orders[$i]->createdAtTimeStamp()