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

Converting a date to a carbon instance from query results

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

我之前的查询只是

$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 API,您可以像这样创建 Carbon 实例:

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

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

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

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

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

即使已接受的答案解决了原始问题 "Converting a date to a carbon instance",但系统的更好解决方案是每次访问该列时都获取 Carbon 日期时间对象。为此,

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

2) 如果它是默认的 created_atupdated_at 时间戳,则确保模型的 public $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();