4

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

我之前的查询只是

$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 的所有文档都是针对您刚刚提取日期而我正在努力弄清楚如何在获得查询结果后对其进行转换,以便我仍然可以在页面上访问它。

任何人都可以帮助吗?

4

2 回答 2

4

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

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

然后按照您想要的方式对其进行格式化:

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

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

PS:您的问卷模型在 $dates 属性中有 created_at 字段?我认为这已经足够了,即使以您现在的方式访问数据。

于 2015-08-16T04:48:16.487 回答
1

尽管接受的答案解决了原始问题“将日期转换为碳实例”,但对于系统来说,更好的解决方案是每次访问该列时都获取一个碳日期时间对象。为了实现这一点,

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();
于 2019-12-06T10:27:06.870 回答