使用 cakephp 从 SQL 中的多行获取逗号分隔的日期

Getting Comma Separated Dates from multiple rows in SQL using cakephp

我是 cakephp 的新手,我不知道应该怎么做。假设我有两个 table,一个是员工 table,另一个是出勤 table.我想在日期以逗号分隔的列中获取员工的缺席日期。我正在使用 cakephp 3.x 和 MySQL.

员工Table

| ID | Name | email |
-------------------------
|111 |  A   |a.com|
|115 |  B   |b.com|
|176 |  C   |c.com|
|156 |  D   |d.com|

出勤率table

| ID |Employee ID| Date     | Status|
---------------------------------
|1   |  111      |2019-01-06|Present|
|2   |  156      |2019-01-06|Absent |
|3   |  111      |2019-01-07|Present|
|4   |  156      |2019-01-07|Absent |
|5   |  111      |2019-01-08|Absent |
|6   |  156      |2019-01-08|Present|
|7   |  111      |2019-01-09|Absent |
|8   |  156      |2019-01-09|Absent |

我希望结果类似于下面的内容 -

想要的结果

| Employee ID | Name | email | Absent Date          |
-------------------------------------------------------
|111          |  A   |a.com  |2019-01-08,2019-01-09|
|156          |  D   |d.com  |2019-01-06,2019-01-07,2019-01-09|

我已经用 group_concat(date) 试过了,但它给出了一个警告,说“无法解析时间字符串”,然后是“未捕获的错误:调用布尔值上的成员函数”。

编辑

我试过了--

$query = $this->Attendance->find()
        ->contain(['Employees'])
        ->select(['Employees.id','Employees.name','Employees.email','date'=>'goup_concat(Attendance.date)'])
->distinct('Employees.id)->toArray();

它给出警告--

DateTimeImmutable:modify(): Failed to parse time string
and Error:Uncaught Error: Call to a member function format()on boolean

请帮助获得想要的结果。 谢谢。

如果你可以使用简单的 sql 查询,你可以这样做,将员工 table 加入出勤 table 并使用 group_concatif将缺勤日期放入列表的函数:

SELECT emp.ID, 
       emp.Name, 
       emp.email, 
       GROUP_CONCAT(IF(att.Status = 'Absent', att.Date, NULL) SEPARATOR ',') AS `Absent Date`  
FROM   Employee emp
JOIN   Attendance att
ON     emp.ID = att.`Employee ID`
GROUP BY emp.ID, emp.Name, emp.email

Demo<>dbfiddle.uk

听起来您不需要查询来使它们以逗号分隔,所以在视图中这样做更好。沿着这些线(未经测试):

$query = $this->Employees->find()
    ->contain(['Attendance' => [
        'queryBuilder' => function (Query $q) {
            return $q->where(['Attendance.status' => 'Absent']);
        }
    ]]);

这将获取员工的列表及其所有缺勤记录。 (如果您只需要 名至少缺勤一次的员工,您可以使用 ->matching(...) 来执行此操作。

那么在你看来:

foreach ($query as $employee) {
    // Output $employee->id, name, email, you know how to do that
    echo implode(',', collection($employee->attendance)->extract('Date')->toArray());
}