使用 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_concat
和 if
将缺勤日期放入列表的函数:
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
听起来您不需要查询来使它们以逗号分隔,所以在视图中这样做更好。沿着这些线(未经测试):
$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());
}
我是 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_concat
和 if
将缺勤日期放入列表的函数:
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
听起来您不需要查询来使它们以逗号分隔,所以在视图中这样做更好。沿着这些线(未经测试):
$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());
}