Tickets сортировка по "форумному принципу"

Всех с наступающем ребятки! Совсем недавно была довольно интересная задачка, нужно было отсортировать последние тикеты по форумному принципу, т.е. вверх поднимается последний опубликованный тикет, либо тикет, в котором последний раз оставляли комментарии. Не нашел в сообществе упоминания чтобы кто-то публиковал как это сделать, по этому решил опубликовать.
Принцип довольно прост, к обычной таблице тикетов подключается таблица комментариев из которой выбирается дата последнего коммента и формируется переменная comment_date_sort. Если тикет не имеет комментариев, то в comment_date_sort идет дата публикации тикета.
За наводку спасибо Илье Уткину (выдрал часть его запроса с другого проекта, над которым он работал), под катом только код.

{'!TicketLatest' | snippet: [
  'action' => 'Tickets',
  'select' => [
    'TicketComment' => 'CASE WHEN TicketComment.createdon IS NOT NULL THEN MAX(TicketComment.createdon) ELSE FROM_UNIXTIME(Ticket.publishedon) END as comment_date_sort'
  ],
  'leftJoin' => [
    'TicketComment' => [
      'class' => 'TicketComment',
      'on' => 'TicketComment.thread = Thread.id'
    ]
  ],
  'sortby' => [
    'comment_date_sort' => 'DESC',
    'publishedon' => 'DESC',
  ]
]}

Обновлено
Как подсказал Василий, цеплять TicketComment не обязательно, по умолчанию уже цепляется Thread в котором содержится дата последнего комментария, но по умолчанию это поле не выбирается в TicketLatest, нужно выбрать через select comment_time у Thread и также как в примере проверять на пустоту и если пустой, то подставлять дату публикации тикета

P.s. не знаю насколько нужны сообществу такие вот заметки на главной, было бы интересно услышать мнение сообщества. Т.к. заметка по сути больше относится к лайвхаку, чем к чему-то серьезному и готовому
Pavel Zarubin
23 декабря 2017, 22:25
17
649
+18

Комментарии: 4

Здоров Александр
24 декабря 2017, 08:58
+2
По мне нужная вещь, когда кто-то столкнулся с ситуацией и нашел решение для задачи, которая явным образом не описана в документации или в вопросах, и описал это для будущих искателей, то такое стоить описать. и поблагодарить автора хотя бы в карму)

P.S. это как с modx.pro/solutions/10051/ когда маленькая по работе вещь, может сделать удобной жизнь клиенту сайта
Василий Столейков
24 декабря 2017, 15:37
1
+1
не знаю насколько нужны сообществу такие вот заметки
Нужны, была задача один в один. Спасибо за готовое решение!
Василий Наумкин
24 декабря 2017, 16:52
+1
TicketComment цеплять вовсе необязательно, у каждого TicketThread, который и так цепляется, есть id и время последнего комментария.
    Pavel Zarubin
    24 декабря 2017, 17:29
    0
    И правда, только по умолчанию это поле не выбирается, нужно выбрать через select comment_time у Thread и также как в примере проверять на пустоту и если пустой, то подставлять дату публикации тикета, спасибо :)
    (это я для тех, кто возможно не понимает как это работает)