【问题标题】:Laravel: How to order date, change the date format and group by the date?Laravel:如何订购日期,更改日期格式和按日期分组?
【发布时间】:2021-09-13 10:05:44
【问题描述】:

我在数据库中有一个日期列表,从列表中,我得到了月份,尽管位于下拉列表中。现在它可以工作,但我不知道如何在更改格式之前通过升序来排序日期。以下是日期列表:

date
2021-08-02
2021-09-30
2021-08-01
2021-09-06
2021-11-05

现在在下拉显示中

August
November
September

应该是

August
September
November

这是我显示下拉菜单的雄辩

$date = DateList::where('id',$id->id)->select(DB::raw("(DATE_FORMAT(date, '%M')) as newDate"))->groupBy('newDate')->get();

我进行了搜索,但仍然找不到有关如何在将日期更改为格式之前获得正确排序日期的方法的答案。希望任何人都可以提供帮助。

【问题讨论】:

  • 在您的查询中添加orderBy('date', 'ASC')
  • DATE_FORMAT 如果您只是将完整的时间戳作为列,则不需要强制转换。只需按该列排序,它应该可以开箱即用。

标签: php laravel eloquent


【解决方案1】:

你为什么不用 laravel 很棒的 collection api 呢?


DateList::where('id',$id->id)
  ->orderBy('date', 'ASC')
  // uncomment the below line if you're concerned with performance
  // ->select('date')
  ->pluck('date')
  ->map(function($date) {
    return $date->format("F");
  })
  ->unique();

【讨论】:

  • 非常感谢!但在我的情况下,我收到错误“调用字符串上的成员函数 format()”,所以我将其修改为 DateList::where('id',$id->id)->orderBy('date','ASC ')->pluck('date')->map(function($date) {Carbon::parse($date)->format('F'); })->unique();它现在可以工作了:)
  • @GarfieldJunior 不错的收获!但是,如果您将日期字段作为字符串获取,则您的迁移和模型类有问题。 Laravel 应该自动将时间戳和日期时间字段转换为 Carbon\Carbon。
  • 如果您不想再次触摸迁移,您还可以自动将字段值转换为日期。参考这个:laravel.com/docs/8.x/eloquent-mutators#date-casting
  • 感谢您提供的信息。但我将日期数据类型设置为 DATE,而不是 DATETIME。它与我得到它作为字符串的结果有关吗?
  • 我不这么认为。如果您没有使用迁移创建表,那么应该有问题。
【解决方案2】:

嘿GarfieldJunior我想不出任何方法来实现上述方法,但我建议的方法是获取月份的数字而不是名称并对其进行排序,然后将数组/集合映射到月份名称, 对于映射事物,您可以使用类似的用户索引数组

$monthNames=[
  1=>"JANUARY",
  2=>"FABRUARY
]

您可以使用 php 的 date() 方法按月数创建一个虚拟日期,它将字符串的格式类型作为第一个参数和第二个 $timestamp
$format ='F' ,

$timestamp=mktime(0,0,0,$monthNumber)
参考mktime
所以简而言之,如果你得到这样的排序月份数数组(我使用的是日期方法而不是索引数组)

$monthsArray=[1,2,3];
$monthNames=array_map(
      function($monthNumber){
           return date("F", mktime(0, 0, 0, $monthNumber));
           }
     ,$monthsArray);

您的输出将如下所示

[
     "January",
     "February",
     "March",
   ]

【讨论】:

    【解决方案3】:

    您可以像这样从您的查询中进行排序

    $date = DateList::where('id',$id->id)
    ->select(DB::raw("(DATE_FORMAT(date, '%M')) as newDate"))
    ->groupBy('newDate')
    ->orderBy('newDate', 'ASC')
    ->get();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-29
      • 1970-01-01
      • 2016-09-05
      • 1970-01-01
      • 2021-08-25
      • 1970-01-01
      • 2021-11-28
      相关资源
      最近更新 更多