LINUX.ORG.RU

Делюсь рецептом вывода древовидных комментариев

 , ,


1

1

Мой любимый вид деревьев — когда они в уже собранном виде, конечно это не отменяет необходимости сохранять parent_id на всякий пожарный, но факт остаётся фактом, чем каждый раз собирать дерево, проще один раз записать полный путь сообщения, который оно проходит в треде, а затем через WHERE path LIKE id || "." || % сделать выборку всех сообщений всего одним SQL-запросом, чтобы вывести нужную нить дискуссии.

Но мало сделать выборку из БД, нужно ещё это дело как-то нарисовать, на помощь приходит CSS, чтобы оформить дочерние сообщения: чтобы было понятно, какое сообщение на какое отвечает.

Пример работы: http://spfng.com/threading.php

Исходный кот: http://spfng.com/threading.php.html

Исходный кот (резервный кот): http://paste.org.ru/?qanvq1

Надеюсь это поможет новичкам реализовать древовидные комментарии в своих проектах.

★★★★★

new SQLite3

Спуфи, ты конечно молодец что продолжаешь. Но может лучше уже перейти на PDO наконец?

shooter93 ★★
()
Ответ на: комментарий от shooter93

а не подскажете, на какое именно? то PDO, которое встроенно в PHP — удовлетворяет все нужды большинства пользователей? или есть какие-то более удобные, улучшенные библиотеки?

часто встречаю, что SQL-запросы записывают в массивах.

Spoofing ★★★★★
() автор топика

Уважаемый автор, а почему у вас в «Пример работы» последний ответ в треде связан пунктирными линиями со всеми предыдущими постами? Что это символизирует по вашей задумке?

С уважением, благодарные новички.

anonymous
()

echo '<div class=«box»>';

Работу-то нашёл?

Deleted
()
Ответ на: комментарий от Spoofing

или есть какие-то более удобные, улучшенные библиотеки?

Если нужно ковыряться с сырыми SQL-данными, я предпочитаю https://github.com/Respect/Relational

Это mapper-обёртка над PDO. Что-то типа бессхемного квази-ORM.

KRoN73 ★★★★★
()

Молодец! Ты изобрел materialized path

kiotoze ★★★★
()

Притом что дерево убого по своей сути. Зачем оно нужно в 2015?

ritsufag ★★★★★
()

Ты все с этими иерархиями никак не наиграешься?

alex_the_v ★★★
()

А теперь добавляем:

INSERT INTO "threading" ("thread_id","thread_text","thread_root","thread_path") VALUES ("15","reply", "2","2.3.15");

И видим, как ломается дерево. Следовательно, сортировать по id неправильно, нужно сортировать по thread_path, но тут ты упрешься в то, что это у тебя строки и «1.10» < «1.2», придется городить костыли типа такой записи «0000001.0000010» (добавлять нули до n знаков, чтобы сортировалось правильно), либо делать программную сортировку уже после выборки (в библиотеках обычно сортируется программно).

Есть ещё в некоторых бд рекурсивные запросы (или иерархические), но за их производительность я не скажу и реализация привязана к СУБД конкретной. И есть другие модели для хранения деревьев, но с ними усложняется структура бд и увеличиваются расходы на поддержание структуры дерева.

nguseff
()
Ответ на: комментарий от OldWiseCat

like это быстро, очень быстро

Сначала кажется что медленно, потом привыкаешь..

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.