всем привет
можно ли и с помощью чего реализовать перемещение по статьям?
типа, находишься на одной статье, а в самом низу две гиперссылки - на предыдущую статью и следующую
всем привет
можно ли и с помощью чего реализовать перемещение по статьям?
типа, находишься на одной статье, а в самом низу две гиперссылки - на предыдущую статью и следующую
А каким образом определяется порядок следования статей?
Если, допустим, по автоинкрементному айдишнику, который, к тому же, гарантированно без пропусков - это одно.
Если по дате публикации, которая, к тому же, вручную задается - совсем другое
Кстати, пока ничего умнее двух дополнительных запросов мне в голову не приходит, так что посижу в этом посте, послушаю умных дядек.
честно говоря я надеялся, что есть встроенная фишка в самом Yii - типа "листалки"… но видимо облом…
сам, в рукопашную, делаю так =
один запрос в базу на выборку всех айдишников статей = получаем массив
этот массив подается в метод, где он слайсом "режется" на две части - до текущего айдишника и после
из этих двух частей выбирается по одному значению: для до берем end-массива, для после берем current-массива
этот метод возвращает ассоциативный массив с двумя значениями для формирования ссылок "следующая статья" и "предыдущая статья"
Ну можно еще и аяксом делать.
А внутри запросы тогда делать вроде этого:
SELECT * FROM table WHERE id<current_id ORDER BY id DESC LIMIT 1;//это вернет следуйщую запись назад
SELECT * FROM table WHERE id>current_id ORDER BY id ASC LIMIT 1;//это вернет следуйщую запись вперед
А если статей будет очень много?) массив станет проблемой. Вообщем смотрите как нужно под задачу.
Собственно говоря вот даже здесь на форуме так сделано, посмотрите внизу Previous Topic Next Topic
жаль только форум не написан на Yii и пример кода формирующего эти ссылки не выложен в открытый доступ…
p.s. пример с двумя запросами - прикольный = спасибо
Можно и в один запрос протащить, через селф-джойн, но вот я фиг знает, насколько это отличатся по производительности.
ну уж если совсем много, то и в таком случае можно сделать ОДИН запрос к базе и сразу получить нужные айдишники вперед и назад
вот так =
(SELECT * FROM `article` WHERE `id_art` < 7 ORDER BY `id_art` DESC LIMIT 1)
UNION ALL
(SELECT * FROM `article` WHERE `id_art` > 7 ORDER BY `id_art` ASC LIMIT 1)
p.s. победил сам себя…
на крайняк можно и закешировать результат запроса
не?
В некоторых случаях (порядок сортировки не меняется, линк однозначно зависит от id) можно, кстати, хранить указатели на предыдущую и следующую записи.
Ну и обновлять триггерами или хуками.
Всяко дешевле, чем джойнить или два лишних запроса делать.
Я решал такую задачу двумя дополнительными запросами, в модель добавил методы findNext() и findPrev(), ничего страшного не произошло, а закэшировать результаты всегда можно
Ну просто обидно, что из-за такой фигни приходится БД грузить лишний раз )