HTML-флажки для добавления / удаления записей в таблице поиска «многие ко многим» (PHP / MySQL) - PullRequest
1 голос
/ 25 июля 2011

У меня есть следующие объекты:

СОТРУДНИК (id, имя, имя, ...)

ПРОЕКТ (id, ...)

EMPLOYEE_PROJECT (employee_id, project_id, ...)

Сотрудник может работать над несколькими проектами, а над проектом может работать более одного сотрудника, поэтому для их связи используется таблица EMPLOYEE_PROJECT.

Я хотел бы создать в своем приложении (PHP / MySQL) форму для данного ИД ПРОЕКТА с флажком рядом с именем каждого сотрудника, который будет отображаться как проверенный, если сущность для этого идентификатора сотрудника существует для этого идентификатора проекта в таблицу EMPLOYEE_PROJECT, которая позволит пользователю проверить или снять флажок с любого сотрудника, а затем нажать кнопку «обновить», чтобы добавить / удалить выбранных / невыбранных сотрудников из проекта, добавив / удалив записи в таблице EMPLOYEE_PROJECT.

Я могу использовать оператор IF для отображения «проверено» на любом объекте, который существует в таблице EMPLOYEE_PROJECT. Мои проблемы:

  1. Правильное формирование запроса для получения списка. Если я получаю список сотрудников по СОЕДИНЕНИЮ СОТРУДНИКА НА EMPLOYEE_PROJECT, он показывает только сотрудников, которые были вовлечены в проект, а не всех сотрудников. Я могу сделать LEFT JOIN, чтобы показать все, но это будет повторять имена сотрудников, которые имеют несколько проектов, и я хочу показать каждое имя только один раз. Если я добавлю GROUP BY employee.id, я смогу получить правильный список только одного из каждого сотрудника, однако результаты не обязательно соответствуют правильному project_id. Если я добавлю HAVING с project_id, я потеряю сотрудников, которых нет в проекте (имейте в виду, что я хочу перечислить ВСЕХ сотрудников, но показываю чек только рядом с теми, которые в данный момент находятся в проекте).

  2. Предполагая, что я выяснил # 1 и могу перечислить всех сотрудников и отобразить чек рядом с теми, которые существуют как сущность EMPLOYEE_PROJECT для указанного проекта, как я могу разрешить изменение флажков пользователем, а затем отправлено и имеет одно действие отправки добавить / удалить соответствующие объекты из таблицы EMPLOYEE_PROJECT?

Большое спасибо !!

Ответы [ 2 ]

3 голосов
/ 25 июля 2011

@ zzarbi правильно для # 2. Для # 1 вам нужен подзапрос:

SELECT employee.*, (SELECT count(id) FROM employee_project 
   WHERE project_id=<project_id> AND employee_id=employee.id) 
   AS in_project 
   FROM employee
2 голосов
/ 25 июля 2011

Для # 1 «перечислить ВСЕХ сотрудников, но показывать чек только рядом с теми, кто в данный момент находится в проекте». (Это работает, только если вы показываете только один проект одновременно)

SELECT * from employee as e
LEFT JOIN EMPLOYEE_PROJECT as ep on ep.employee_id = e.id
WHERE ep.project_id = <project id>

в php:

if("employee_id" IS NOT NULL/empty){
    echo "check";
}

Для # 2, обычно моя средняя таблица project_employee не имеет ничего, кроме двух id (employeeId, projectId). Поэтому я обычно просто удаляю каждого сотрудника для этого идентификатора проекта и повторно добавляю их. Если у вас есть другие данные в той же таблице, это может не сработать. И вам придется сравнить старое хранилище данных с новыми данными, которые будут сохранены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...