Laravel 5 如何在 select 子句中使用 Carbon 转换日期相关列?

Posted

技术标签:

【中文标题】Laravel 5 如何在 select 子句中使用 Carbon 转换日期相关列?【英文标题】:Laravel 5 How to convert date related column using Carbon in select clause? 【发布时间】:2016-10-27 11:41:44 【问题描述】:

我是 php 和 laravel 的新手,并且使用 laravel 5.2 和 MariaDB 10.1.xx。

测试表有索引和日期 (yyyymmdd) 列。

我想将日期格式从 yyyymmdd 转换为 YYYYmm,而不在 select 子句中使用原始查询。

我试过如下:

$test = DB::table('test')
->select( 'idx',Carbon::parse('date')->format('Ym') );

并得到如下错误:

DateTime::__construct(): Failed to parse time string (date) at position 0 (n): The timezone could not be found in the database.

请让我知道如何使用 carbon not raw 查询来解决这个问题。

【问题讨论】:

【参考方案1】:

在您的模型 (Test) 中添加受保护的字段 $dates

class Test 
    //...
    protected $dates = ['created_at', 'updated_at', 'date'];
    //...

这告诉 Eloquent 字段 date(以及默认的时间戳字段)包含一个日期。 $entity->date 现在将包含 Carbon 实例,用于类型为 Test 的实体。您可以使用它来格式化日期 ($entity->date->format('Ym');)

你甚至可以写一个Accessor 来为你做这件事:

class Test 
    //...
    public function getFormattedDateAttribute() 
        return $this->attributes['date']->format('Ym');
    
    //...

echo $entity->formatted_date;

【讨论】:

【参考方案2】:

其他选择是在你的模型中使用类似的修改器

public function getDateAttribute($value)
    return Carbon::createFromFormat('Y-m-d', $value)->toDateTimeString();


您可以根据需要更改或使用它

【讨论】:

以上是关于Laravel 5 如何在 select 子句中使用 Carbon 转换日期相关列?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Laravel 5.8 中使 chart.js 动画/增长/活着?

Laravel 5.8,在 where 子句中带有 Count(*) 的棘手子查询

Laravel 5,连接子句中的派生表?

如何在 Oracle 中使 Select 语句更快

在 Laravel 5 迁移中使列不可为空

如何在 Laravel 中将两个分组的 whereIn 子句与 Where not 组合