从查询结果将日期转换为碳实例

时间:2015-08-16 04:27:38

标签: php mysql laravel laravel-5 php-carbon

我最近在我拥有的审核队列中添加了一些功能。调查表现在不是查询一个表,而是查询用户,以便我可以获取他们的用户名。

我之前的查询只是

$questionnaire = Questionnaire::all();

然后当我在页面上访问它时,我可以像这样格式化它:

{{ $questionnaire->created_at->format('F d, Y h:ia') }}

这是我的新查询在我的控制器中的显示方式:

public function moderate()
    {
        $questionnaires = DB::table('users')
                        ->join('questionnaire', 'users.id', '=', 'questionnaire.memberid')
                        ->select('users.username', 'questionnaire.*')
                        ->get();
        return view('questionnaire.moderate', ['questionnaires' => $questionnaires]);
    }

但是,当我尝试访问页面上的created_at日期时,我收到Call to a member function format() on a non-object错误。我的挖掘让我相信这是因为日期没有转换为碳实例。

然而,关于Carbon的所有文档都是针对当你刚刚提取日期的时候我在努力弄清楚如何在获得查询结果之后如何转换它以便我仍然可以在页面上访问它。

任何人都可以吗?

2 个答案:

答案 0 :(得分:3)

根据Carbon API,你可以像这样创建一个Carbon实例:

$myDate = new Carbon($questionnaire->created_at);

然后按照您想要的方式格式化:

{{ $myDate->format('F d, Y h:ia') }}

它可能不是你想要的,但它会起作用。

P.S:您的问卷调查模型在$ dates属性中有created_at字段?我认为这就足够了,甚至可以按照你现在的方式访问数据。

答案 1 :(得分:1)

即使接受的答案解决了原始问题“将日期转换为Carbon实例”,对于系统来说,更好的解决方案还是应该在每次访问该列时都获得Carbon Datetime对象。为此,

1)如果是自定义列,请确保将其列在要访问的模型的受保护的$dates属性中,如此处https://laravel.com/docs/master/eloquent-mutators#date-mutators所述。

2)如果其默认时间戳为created_atupdated_at,请确保模型的公共$timestamps属性设置为true。

之后,您可以轻松地将列作为Carbon日期时间对象检索为

{{ $questionnaire->created_at->format('F d, Y h:ia') }}

,而不必在其他所有查询上都将列转换为日期时间。

在您的特定情况下,看起来Questionnaire模型已正确设置,因此您可以将列作为日期时间对象进行访问。因此,我认为以下代码适用于您的情况:

$questionnaires = Questionnaire::select('users.username', 'questionnaire.*')
                        ->join('users', 'questionnaire.memberid', '=', 'users.id')
                        ->get();