Предыдущие части: 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, выводя вместо пустого места что-нибудь более информативное:

И будет это выглядеть так: