Хорошо, этот трюк предназначен для новых программистов ColdFusion, так как большинство опытных программистов либо знают это, либо чувствуют себя глупо, признавая, что не знали.
Предположим, у вас есть таблица пользователей, и каждый пользователь относится к определенному отделу.
Для простоты предположим, что идентификатор отдела хранится в таблице пользователей, поскольку в одном отделе может находиться только один пользователь.
Таким образом, у вас может быть запрос, который выглядит следующим образом
SELECT u.firstName, u.lastName, u.email, d.departmentName, d.departmentID FROM users u JOIN department d on d.departmentid = u.departmentid ORDER BY u.lastname
SELECT u.firstName, u.lastName, u.email, d.departmentName, d.departmentID FROM users u JOIN department d on d.departmentid = u.departmentid ORDER BY u.lastname
Этот код SQL вернет список всех пользователей в вашей таблице, и они будут упорядочены по фамилиям.
Теперь давайте предположим, что когда вы начинали, было всего несколько сотрудников и два отдела. Так что вы можете просто сделать что-то вроде этого для вывода:
Имя сотрудника | Электронная почта сотрудника | Сотрудник отдела |
---|---|---|
#фамилия Имя# | #Эл. адрес# | #название отдела# |
Теперь вы можете придумать его и сделать так, чтобы пользователи могли щелкать заголовок столбца и сортировать по этому столбцу, если хотите, но мы пока пропустим это.
Теперь, скажем через 2 года, ваша компания стремительно растет. Теперь у вас 50 сотрудников и 5 разных отделов. Ваше маленькое приложение со списком сотрудников больше не сокращает его.
Ваш начальник говорит, что ему нравится, когда все сотрудники на одной странице, но он предпочел бы, чтобы они были сгруппированы по отделам. Вы принимаете это руководство и возвращаетесь в свой офис.
Теперь первое, что вы можете сделать, - это запросить в БД информацию об отделах, а затем перебрать все отделы и захватить соответствующих сотрудников. Это вполне приемлемо, но позвольте мне показать вам способ сделать это быстрее и с меньшим количеством кода.
Возьмите свой предыдущий запрос и измените его так
SELECT u.firstName, u.lastName, u.email, d.departmentName, d.departmentID FROM users u JOIN department d on d.departmentid = u.departmentid ORDER BY d.departmentName
Теперь вы заметите все, что мы сделали - изменили порядок по пунктам. Это становится важным позже.
Теперь самое интересное! Давайте покажем это так, как этого хочет босс. Посмотрите на этот код ниже.
#название отдела# | |
---|---|
#фамилия Имя# | #Эл. адрес# |
Итак, как это работает? Ключом является порядок по условию и размещение ваших тегов cfoutput.
Сначала вы заметите, что мы избавились от нашего тега cfloop и заменили его тегом cfoutput с атрибутами запроса и группы.
Теперь, что вы можете или не можете знать, когда вы делаете
сервер ColdFusion будет перебирать результаты запроса и выводить код между начальным и конечным тегом для каждой строки в вашем наборе результатов.
Теперь, учитывая эту логику, вы можете подумать, что мы получим один ужасный вывод с повторением названия отдела перед каждым сотрудником. Не с ColdFusion! Позже вы увидите дополнительную пару тегов cfoutput в таблице (в начале и в конце HTML-кода для строки данных нашего сотрудника).
ColdFusion выполнит все внешние теги один раз и все внутри будет повторяться для каждой строки, НО выводит только те строки, в которых есть сотрудники в этом отделе.
Таким образом, в перспективе сервер ColdFusion выполнит этот код один раз
затем он зациклит этот код для каждой записи сотрудника, убедившись, что выводит только тех сотрудников, которые относятся к указанному выше отделу
и тогда он выведет этот код:
#название отдела# | |
---|---|
#фамилия Имя# | #Эл. адрес# |
Завершить процесс.
Короче говоря, сервер ColdFusion сделает двойную петлю для вас.
Предостережение заключается в том, что значение вашей группы = ”” в вашем теге cfoutput должно совпадать с предложением order by в вашем операторе SQL.
Разве это не было проще, чем делать все циклы самостоятельно?