【问题标题】:Laravel eloquent: GroupBy EMPLOYEE then DAYLaravel 雄辩:GroupBy EMPLOYEE then DAY
【发布时间】:2020-09-10 22:45:17
【问题描述】:

我正在使用 Laravel (6.3) 构建一个 Web 应用程序

我有一张表appointments,下面是几列

  • 身份证
  • 开始日期时间
  • 结束日期时间
  • employee_id
  • client_id

我想得到按员工分组的结果,然后在员工内部按 DAY 分组,如下所示:

  0 => array:5 [▼
    "Angela" => array:6 [▼
        "2020-05-25" => array:2 [▼
            0 => array:6 [▼
              "employee_id" => 6
              "appointmentId" => 566
              "startDateTime" => "2020-05-25 08:00:00"
              "endDateTime" => "2020-05-25 09:00:00"
              "employee" => "Angela"
              "img_slug" => "salon-adam_angela.jpg"
            ]
            1 => array:6 [▼
              "employee_id" => 6
              "appointmentId" => 567
              "startDateTime" => "2020-05-25 09:00:00"
              "endDateTime" => "2020-05-25 10:30:00"
              "employee" => "Angela"
              "img_slug" => "salon-adam_angela.jpg"
            ]
        ]
        "2020-05-26" => array:3 
        "2020-05-27" => array:2
        "2020-05-28" => array:4
        "2020-05-29" => array:2
        "2020-05-30" => array:1
    ]
    "Stefanie" => array:6
    "Karolina" => array:6
    "Martina" => array:6
    "Ivonne" => array:1
  ]
]

我使用的是 Laravel,所以我的 eloquent 查询看起来像这样

Appointment::where('appointments.employee_id', $employeeId)
    ->join('employees', 'employees.id', 'appointments.employee_id')
    ->join('users', 'users.id', 'employees.user_id')
    ->orderBy('appointments.startDateTime')
    ->select(
        'employees.id as employee_id',
        'appointments.id as appointmentId', 'appointments.startDateTime', 'appointments.endDateTime',
        'users.first_name as employee'
    )                     
    ->get()
    ->groupBy('employee')
    ->groupBy('appointments.startDateTime')
    ->toArray();

但它只是按员工分组,而忽略了这一天。

如果我消除->groupBy('appointments.startDateTime'),我会得到所有按员工正确分组的约会,但是当我添加第二个分组时,它只会得到两个更深层次的数组,而不是按日期分组。

我尝试了所有已知的组合都没有成功

我在这里做错了什么?

【问题讨论】:

    标签: laravel eloquent


    【解决方案1】:

    您正在尝试按日期时间而不是日期进行分组。

    您需要将您的日期时间leftsubstr 转换为一个日期,以便您可以按它进行分组。 Here's an example of how to do it in MySQL

    ->addSelect(DB::raw("left(appointments.startDateTime, 10) as startDate")) 添加到您的查询构建器中(或者将DB::raw 及其内容包含在您当前的->select() 中)。

    然后把你的 group bys 改成->groupBy(['employee', 'startDate']),你就应该是金子了。

    【讨论】:

    • 它给出了完全相同的结果:每个员工的所有约会都放在一起。我正在尝试在每个员工内部组织每天的约会
    • 将两者合二为一groupBy->groupBy(["employee", "startDate"])
    • 甜蜜,我更新了我的答案以匹配。我只是忘记了两个groupBy()s 是如何在同一个Builder 上交互的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-16
    • 2014-11-08
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    相关资源
    最近更新 更多