У меня есть приложение для управления проектами, которое я создаю с помощью PHP и MySQL, и приведенная ниже функция используется для массового обновления всех задач, связанных с проектом, в некоторых случаях это может быть 200-300 записей MySQL, которые обновляются одновременно.
Я только что понял, что в моем дизайне есть недостаток. Эта функция ОБНОВЛЯЕТ мои столбцы базы данных status
, date_modified
, а также date_completed
В большинстве случаев это здорово, но я только что понял, что часто пользователь забывает «запустить» задачу, которая устанавливает date_started
колонка.
Если date_started
столбец никогда не устанавливается, он будет иметь значение 0000-00-00 00:00:00
и с date_started
столбец установлен в 0000-00-00 00:00:00
и date_completed
столбец, установленный на СЕЙЧАС … это нарушает функциональность моей диаграммы Ганта для этих задач.
Поэтому мне нужно изменить мой SQL ниже, чтобы при установке status
в completed
он каким-то образом проверит, date_stared
колонка === 0000-00-00 00:00:00
и если это произойдет, он должен будет также обновить этот столбец до СЕЙЧАС.
Я считаю, что это возможно с помощью CASE
в MySQL вместо необходимости запрашивать каждую запись в PHP, чтобы выполнить проверку, а затем делать отдельное ОБНОВЛЕНИЕ, когда это необходимо, но мой опыт работы с этими более продвинутыми функциями SQL очень мал.
Может ли кто-нибудь помочь мне с решением?
public function completeAllTasks($projectId, $completed_date = true){
// Update Project Task STATUS and Date_MODIFIED
$sql = "UPDATE `project_tasks`
SET `status` = 'Completed',
`modified_user_id` = '$this->user_id',
`date_completed` = UTC_TIMESTAMP()
`date_modified` = UTC_TIMESTAMP()
WHERE `project_id` = '$projectId'
AND `status` != 'Completed'
AND `heading` != '1'";
return $this->db->query($sql);
}
ОБНОВИТЬ
Я провел некоторое тестирование, и это, кажется, делает свое дело …
`date_started` = (CASE
WHEN date_started = '0000-00-00 00:00:00'
THEN UTC_TIMESTAMP()
ELSE date_started
END)
$sql = "UPDATE `project_tasks`
SET `status` = 'Completed',
`modified_user_id` = '$this->user_id',
`date_completed` = UTC_TIMESTAMP(),
`date_modified` = UTC_TIMESTAMP(),
`date_started` = CASE
WHEN date_started = '0000-00-00 00:00:00' THEN NOW()
ELSE date_started
END
WHERE `project_id` = '$projectId'
AND `status` != 'Completed'
AND `heading` != '1'";
Других решений пока нет …