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

4

我最近在为我的审核队列添加一些功能。现在除了查询Questionnaire表之外,还要查询Users表以便获取他们的用户名。

我的先前查询只是:

$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实例。但是,所有关于Carbon的文档都是针对您只是提取日期时的情况,我很难弄清楚如何在获取查询结果后进行转换,以便仍然可以在页面上访问它。有人能帮忙吗?
2个回答

4
根据 Carbon API,您可以像这样创建 Carbon 实例:

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

然后按照您的要求进行格式化:
{{ $myDate->format('F d, Y h:ia') }}

可能不完全符合您的要求,但它可以工作。

P.S:您的问卷模型是否将created_at字段放在$dates属性中?我认为这已经足够了,即使现在您正在访问数据的方式也是如此。


我应该在哪里设置$myDate变量呢?是在视图中吗?查询会拉取一堆记录,然后我会使用foreach循环来在页面上显示它们。 - James
1
如果你想在视图中完成它,你可以这样做:{{ (new Carbon\Carbon($questionnaire->created_at))->format('F d, Y h:ia') }},而不是 {{ $questionnaire->created_at->format('F d, Y h:ia') }}。 - zeratulmdq

1
尽管已经有一个被接受的答案解决了原问题“将日期转换为Carbon实例”,但更好的解决方案是每次访问该列时都获取一个Carbon日期时间对象。为了实现这一点,
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();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接