Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Деревья

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
melomaniac
Отправлено: 26 Марта, 2014 - 21:30:44
Post Id



Новичок


Покинул форум
Сообщений всего: 61
Дата рег-ции: Февр. 2014  


Помог: 0 раз(а)




Всем привет. Подскажите пожалуйста, как лучше вывести потомков, т.е. есть таблица вида


CODE (SQL):
скопировать код в буфер обмена
  1.  
  2. id  parent_id name
  3. ----------------------------
  4.  1   |    0     |  Cat1
  5. ----------------------------
  6.  2   |    1     |  Cat2
  7. ----------------------------
  8.  3   |    2     |  Cat3
  9. ----------------------------
  10.  4   |    0     |  Cat4
  11.  


Как выбрать всех потомков категории Cat1, включая ее саму, т.е. в итоге получить Cat1, Cat2 и Cat3 ?
 
 Top
Мелкий Супермодератор
Отправлено: 26 Марта, 2014 - 21:38:16
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




На Adjacency List (схема id-parent) невозможно выбрать только одну ветку. Или всё дерево целиком загрузить в скрипт и там построить нужную ветвь или рекурсивно обходить, генерируя кучу запросов.

Если операция нужна часто, лучше посмотрите другие методы хранения дерева:
http://habrahabr[dot]ru/post/193166/
http://habrahabr[dot]ru/post/47280/
У каждого способа свои тараканы


-----
PostgreSQL DBA
 
 Top
melomaniac
Отправлено: 26 Марта, 2014 - 21:45:58
Post Id



Новичок


Покинул форум
Сообщений всего: 61
Дата рег-ции: Февр. 2014  


Помог: 0 раз(а)




Мелкий пишет:
На Adjacency List (схема id-parent) невозможно выбрать только одну ветку. Или всё дерево целиком загрузить в скрипт и там построить нужную ветвь или рекурсивно обходить, генерируя кучу запросов.

Если операция нужна часто, лучше посмотрите другие методы хранения дерева:
http://habrahabr[dot]ru/post/193166/
http://habrahabr[dot]ru/post/47280/
У каждого способа свои тараканы


Спасибо, почитаю. Дело в том что у меня есть метод:

PHP:
скопировать код в буфер обмена
  1.  
  2. public function ShowTree($ParentID)
  3.         {  
  4.                 $result = Category::model()->find('parent_id=:parent_id', array(':parent_id'=>$ParentID));
  5.                 while ($result) {
  6.                     echo $result['id'];
  7.                     $this->ShowTree($result['id']);
  8.                     break;          
  9.             }
  10.         }
  11.  


Но не знаю стоит ли так делать, меня бы возможно устроил данный вариант, но при выводе получаю строку вида 123. А мне нужно через запятую, т.е. вот так - 1,2,3
Пытался сделать через explode, но проблема в том, что данная функция работаент с массивом, а если я пытаюсь получить массив, примерно так:
PHP:
скопировать код в буфер обмена
  1.  
  2. function ShowTree($ParentID)
  3.         {  
  4.                 $array = array();
  5.                 $result = Category::model()->find('parent_id=:parent_id', array(':parent_id'=>$ParentID));
  6.                 while ($result) {
  7.                     $array[] = $result['id'];
  8.                     $this->ShowTree($result['id']);
  9.                     break;          
  10.             }
  11.          return $array;
  12.         }
  13.  

Получаю только последнее значение, т.е. вместо 123 получаю только 3 Огорчение

(Отредактировано автором: 26 Марта, 2014 - 21:52:24)

 
 Top
T1grOK
Отправлено: 27 Марта, 2014 - 07:17:56
Post Id



Частый гость


Покинул форум
Сообщений всего: 129
Дата рег-ции: Июнь 2013  


Помог: 7 раз(а)




Это так понимаю Yii под него есть extension - nested sets, подключаем как поведение(behavior) и пользуемся.

(Отредактировано автором: 27 Марта, 2014 - 07:18:41)



-----
Mysql, Postgresql, Redis, Memcached, Unit Testing, CI, Kohana, Yii, Phalcon, Zend Framework, Joomla, Open Cart, Ymaps, VK Api
 
 Top
Мелкий Супермодератор
Отправлено: 27 Марта, 2014 - 08:43:35
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




melomaniac пишет:
Дело в том что у меня есть метод:

Это как раз:
Мелкий пишет:
рекурсивно обходить, генерируя кучу запросов.

Чем больше дерево, тем больше нагрузка на СУБД.

melomaniac пишет:
Получаю только последнее значение, т.е. вместо 123 получаю только 3

Вы никуда не сохраняете результат рекурсивного вызова $this->ShowTree


-----
PostgreSQL DBA
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB