Работает метод getAllBugsWithComments предельно просто. Он выполняет запрос к БД и возвращает результат его выполнения в виде массива. Самая интересная часть – это, конечно, сам запрос. Для того, чтобы сформировать дерево, нам нужны данные о багах, сведения о категориях к которым они относятся и комментарии к ним. Поэтому в запросе мы выполняем объединение трех таблиц (bugs, categories, comments). Рассмотрим, как выполняется это объединение. Прежде всего, обратите внимание на то, что таблицы объединяются слева направо (LEFT JOIN). На первом этапе объединяются таблицы bugs и categories. Т. к. каждому багу соответствует только одна категория, то в результате мы получим исходную таблицу bugs с двумя новыми столбцами link и name из таблицы categories. Обратите внимание, что т. к. таблица bugs расположена слева, то в результат войдут только те записи из таблицы categories, для которых есть соответствующая запись в таблице bugs. Другими словами, если у нас есть категория, в которой нет ни одного бага, то сведений о ней в результирующей таблице не будет. На следующем этапе происходит объединение с таблицей comments. Тут возможны два варианта. Первый – очередной баг не имеет комментариев. В этом случае в результирующей таблице будет одна строка со сведениями из таблиц bugs и categories, а все поля, соответствующие таблице comments будут иметь значения NULL. Второй – очередной баг имеет один или более комментариев. Тогда в результирующей таблице будет одна или более строк с данными из таблиц bugs, categories и comments. Причем количество таких строк определяется количеством комментариев. Посмотрите на пример такой таблицы (я опустил часть полей).
id | title | … | name | … | c_description |
1 | Баг 1 | … | Критические ошибки | … | Комментарий к багу 1 |
2 | Баг 2 | … | Пожелания | … | NULL |
3 | Баг 3 | … | Критические ошибки | … | Первый комментарий к багу 3 |
3 | Баг 3 | … | Критические ошибки | … | Второй комментарий к багу 3 |
Переходим к преобразованию этой таблицы в HTML список. Т. к. операция довольно сложная, то будет удобно написать для неё небольшую библиотеку – Table2Tree. Для этого создаём файл application\libraries\table2tree. php (название файла совпадает с названием библиотеки). Но, прежде чем переходить к описанию библиотеки, рассмотрим пример её использования. Допустим, у нас есть контроллер (bugtracker) с методом page (формирует страницу со списком багов и комментариев).