#php #mysql #sql #cakephp-3.0
#php #mysql #sql #cakephp-3.0
Вопрос:
Я довольно новичок в cakephp и не могу понять, как это должно быть сделано.Допустим, у меня есть две таблицы: одна — таблица сотрудников, а другая — таблица посещаемости. Я хочу получить отсутствующие даты сотрудников в столбце, где даты разделены запятыми. Я использую cakephp 3.x и MySQL.
Таблица сотрудников
| ID | Name | email |
-------------------------
|111 | A |a.com|
|115 | B |b.com|
|176 | C |c.com|
|156 | D |d.com|
Таблица посещаемости
| 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(дата), но он выдает предупреждение «Не удалось проанализировать временную строку», а затем «Неперехваченная ошибка: вызов функции-члена по логическому значению».
Редактировать
Я пробовал—
$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
Пожалуйста, помогите получить желаемый результат.
Спасибо.
Комментарии:
1. Можете ли вы показать, что вы уже пробовали, может быть, будет проще показать, где вы ошиблись.
2. Вам нужно, чтобы они были разделены запятыми по какой-то причине, связанной с другим кодом, или вы просто хотите показать их разделенными запятыми в представлении где-нибудь?
3. Я просто хочу показать их как разделенные запятыми в представлении. Любая помощь будет оценена. @GregSchmidt
Ответ №1:
Похоже, вам не нужен запрос, чтобы сделать их разделенными запятыми, так что это лучше сделать в представлении. В соответствии с этими строками (непроверено):
$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());
}
Ответ №2:
Если вы можете использовать простой sql-запрос, вы делаете это следующим образом: объедините таблицу employees с таблицей посещаемости и используйте group_concat
if
функцию with, чтобы получить даты отсутствия в списке :
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