Предыдущие части: JOIN, Делаем список категорий
Код для этого выпуска лежит на github в ветке delete-update.
В прошлом выпуске мы добавили таблицу категорий, связанную с таблицей заметок. Всё работает, но остались две задачи: удаление категорий и повторное редактирование заметки.
Они не сильно сложные, поэтому сейчас с ними разберёмся.
Это в общем-то самое обыденное действие, но из-за того, что категории связаны с заметками, возникает небольшое затруднение.
Если мы удалим заметку, это никак не повляет на всё остальное. Но если мы удалим категорию, тогда у всех заметок, которые принадлежат этой категории, останется недействительный идентификатор категории category_id.
Скажем, у категории "автомобили" id=100. Мы написали несколько заметок, назначив им категорию "автомобили", следовательно у них category_id=100. Когда мы просматриваем список заметок, или отдельную заметку, имя категории достаётся из таблицы категорий, основываясь на category_id, который хранится в заметке.
Но если эта категория удалена, то мы там ничего не найдём, и возникнет ошибка: в заметке записан category_id, но такой категории нет.
Поэтому при удалении категории нужно дополнительно делать что-то с заметками, у которых указана эта категория. Мы можем просто очистить поле category_id, присвоив ему NULL. Это будет означать, что такие заметки не привязаны ни к каким категориям. Их можно будет, например, отредактировать позже, назначив им какую-то новую категорию.
Либо же мы можем завести специальную категорию, которая называется "Без категории", и присваивать её id всем заметкам, которые лишились категории. Что в общем-то примерно то же самое, что и присваивать NULL, просто логика немного другая. В частности, категорию "Без категории" мы тоже можем удалить, и тогда опять начнутся проблемы.
Поэтому, наверное, лучше присваивать NULL.
Допишем код удаления категории в контроллере category.php, добавив в него обнуление category_id у всех связанных заметок:
Я удалил у себя категорию "автомобили" и теперь в моём списке заметок одна заметка отображается без категории:
Чтобы не вводить пользователя в заблуждение, можно обработать это в представлении note/index.php, выводя вместо пустого места что-нибудь более информативное:
И будет это выглядеть так: