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. не знаю насколько нужны сообществу такие вот заметки на главной, было бы интересно услышать мнение сообщества. Т.к. заметка по сути больше относится к лайвхаку, чем к чему-то серьезному и готовому
24 декабря 2017, 01:25    Pavel Zarubin   G+  
16    352 +18

Комментарии (4)

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

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