Получение дат, разделенных запятыми, из нескольких строк в SQL с помощью cakephp

#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
 

Демонстрация <>dbfiddle.uk