Зато в контроллерах появляется много дублирования кода обработки ошибок валидации.
Оба варианта имеют право на жизнь, Laravel как-то пока не умер, кидая исключения. Всё сказанное вами верно, но для такого базового функционала подход Laravel мне кажется приемлемым на практике.
Ничего странного — волшебных сил электричества не существует и проблема всегда в коде. Проблемы с таймзоной это одно, а вот «замороженных» минут просто быть не может.
Там, я так понимаю, примерно дублируется код шаблона. Тогда запрос инициируется вот этой проверкой: @if (count($item->children) > 0)
Вы в контроллере грузите детей, а потом в цикле проверяете наличие детей у этих детей.
Если у вас только два уровня вложенности, передавайте в паршиал флаг, что это последний уровень или вообще уберите оттуда итерирование по детям.
Если вложенность неограниченная, то при такой структуре данных загрузить всё стандартным функционалом не выйдет.
Но можно указать столько уровней, сколько есть обычно: BookCategory::with('children.children.children').
Или выбирать все категории плоским списком, а дерево строить рекурсивно уже в контроллере.
Ну а лучше совсем поменять структуру хранения и использовать, например, nested set.
Оба варианта имеют право на жизнь, Laravel как-то пока не умер, кидая исключения. Всё сказанное вами верно, но для такого базового функционала подход Laravel мне кажется приемлемым на практике.