За последние 24 часа нас посетили 30503 программиста и 1807 роботов. Сейчас ищут 827 программистов ...

Дерево из 2 таблиц

Тема в разделе "PHP для новичков", создана пользователем webheader, 19 дек 2016.

  1. webheader

    webheader Активный пользователь

    С нами с:
    7 окт 2013
    Сообщения:
    15
    Симпатии:
    0
    Всем доброго времени суток.
    Есть вопрос, как реализовать функцию формирования дерева из 2 таблиц.

    В одной таблице родители, в другой дети.

    При этом, есть несколько странное условие... Если у детей есть родители, то показать их.

    Как это можно реализовать? Думаю у меня вся загвоздка в sql запросе.
     
  2. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    "SELECT `parents` FROM `table` WHERE `child_id` = '%Идентификатор ребёнка%'"
    Таблицы выглядят примерно так:
    ID | parents | child_id (Таблица родителей)
    ID |child_id | child_info (Таблица детей)
    Если я правильно понял задачу
     
  3. webheader

    webheader Активный пользователь

    С нами с:
    7 окт 2013
    Сообщения:
    15
    Симпатии:
    0
    Вообще я планировал примерно такие таблицы
    id | name (родители)
    id | id_parents | name (дети)

    Иначе, при создании детей, придется каждый раз обновлять родителей. ИМХО не удобно
     
  4. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    SELECT id_parents FROM childrens WHERE id = $child_id
    Пишем ид родителя в переменную, например $parent_id
    $res = mysqli_query($db, "SELECT name FROM parents WHERE id = $parent_id");
    if mysqli_num_rows($res) {
    while ($row = mysqli_fetch_assoc ($res)) {
    echo $res['name'];
    }
    } else echo 'Родителей нет!';
     
  5. webheader

    webheader Активный пользователь

    С нами с:
    7 окт 2013
    Сообщения:
    15
    Симпатии:
    0
    Таким образом получается 2 запроса, это не есть гуд.
    Это получится 2 массива, которые не очень удобно перебирать в foreach
    Вот как это должно получиться в итоге - https://yadi.sk/d/tNwSSxSRJvfZN
     
  6. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    А что тут неудобного то?
    --- Добавлено ---
    Или надо выпендриться? Чтоб не так как у всех))))
     
  7. webheader

    webheader Активный пользователь

    С нами с:
    7 окт 2013
    Сообщения:
    15
    Симпатии:
    0
    Да не, я без выпендрежа готов ))) Просто не хочется быдлокодинга )))
    Я попробовал через join по базе собрать в один массив, в принципе вариант вроде не плохой.
    Но я туплю с тем, как это в цикле разложить, чтобы получилось как на картинке.
    Так как массив получается примерно таким
    Код (Text):
    1. Array
    2. (
    3.     [0] => Array
    4.         (
    5.             [id] => 1
    6.             [name] => счет
    7.             [name_parent] => Сделка 1
    8.             [id_parent] => 1
    9.         )
    10.     [1] => Array
    11.         (
    12.             [id] => 2
    13.             [name] => счет
    14.             [name_parent] => Сделка 1
    15.             [id_parent] => 1
    16.         )
    17. )
    И получается, что мне в цикле foreach нужно задать, какое-то условие if, собственно с этим и трабл.
    Если получить 2 массива, один с родителями, другой с детьми, то получается вроде тоже самое.
     
  8. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Уже заведомо неправильная архитектура. Если ты строишь дерево, то у тебя каждый его узел может быть, потенциально, и потомком и родителем. В какую из двух таблиц его определять будешь?
     
  9. webheader

    webheader Активный пользователь

    С нами с:
    7 окт 2013
    Сообщения:
    15
    Симпатии:
    0
    Ну в моем понимании это дерево, но состоит оно из 2 уровней. Родители и дети фиксированы.
    Сейчас вопрос по большей части как это разложить через foreach
     
  10. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    если уровень вложенности один, то просто пройти по всем детям, и распихать по всем родителям $дерево[ $ребёнок[родителя ID] ] [ $ребёнок[ID] ] = $ребёнок;
     
  11. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Это не дерево, а просто связь один-ко-многим. Решается через внешние ключи. Скучно.
     
  12. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    это куст!