Как я могу исключить внуков из моего рекурсивного процесса запроса?

Как я могу исключить внуков из моего рекурсивного процесса запроса?

07.05.2019 12:52:11 Просмотров 55 Источник

Я пытаюсь ограничить свой вывод БД , который в настоящее время дает мне из некоторых категорий каждый ребенок и внук-только ребенок. Так что никаких внуков не отображается.

Я пытался ограничить рекурсию только один раз, но это не работает. Я думаю, что ответ лежит в запросе db, но я не знаком с dbs.

public function getChildCategories(&$result, &$categories, $level = 1)
{
    $db = EB::db();

    $ordering = $this->params->get('order', 'popular');
    $sort = 'desc';
    $total = (int) $this->params->get('count', 0);
    $hideEmptyPost = $this->params->get('hideemptypost', false);
    $language = EB::getCurrentLanguage();

    foreach ($result as $row) {
        // Initialize default structure
        $category = EB::table('Category');
        $category->bind($row);
        $category->cnt = $row->cnt;

        $categories[$row->id] = $category;
        $categories[$row->id]->childs = array();

        // Find child categories
        $query = array();
        $query[] = 'SELECT a.*, COUNT(' . $db->qn('b.id') . ') AS ' . $db->qn('cnt') . ',' . $db->Quote($level) . ' AS ' . $db->qn('level');
        $query[] = 'FROM ' . $db->qn('#__easyblog_category') . ' AS a';
        $query[] = 'LEFT JOIN ' . $db->qn('#__easyblog_post_category') . ' AS pc';
        $query[] = 'ON ' . $db->qn('a.id') . '=' . $db->qn('pc.category_id');
        $query[] = 'LEFT JOIN ' . $db->qn('#__easyblog_post') . ' AS b';
        $query[] = 'ON ' . $db->qn('b.id') . '=' . $db->qn('pc.post_id');
        $query[] = 'AND ' . $db->qn('b.published') . '=' . $db->Quote(EASYBLOG_POST_PUBLISHED);
        $query[] = 'AND ' . $db->qn('b.state') . '=' . $db->Quote(EASYBLOG_POST_NORMAL);
        $query[] = 'WHERE ' . $db->qn('a.published') . '=' . $db->Quote(1);
        $query[] = 'AND ' . $db->qn('parent_id') . '=' . $db->Quote($row->id);

        if ($language) {
            $query[] = 'AND(';
            $query[] = $db->qn('a.language') . '=' . $db->Quote($language);
            $query[] = 'OR';
            $query[] = $db->qn('a.language') . '=' . $db->Quote('');
            $query[] = 'OR';
            $query[] = $db->qn('a.language') . '=' . $db->Quote('*');
            $query[] = ')';
        }

        if (!$hideEmptyPost) {
            $query[] = 'GROUP BY ' . $db->qn('a.id');
        } else {
            $query[] = 'GROUP BY ' . $db->qn('a.id') . ' HAVING (COUNT(' . $db->qn('b.id') . ') > 0)';
        }

        if ($ordering == 'ordering') {
            $query[] = ' ORDER BY `lft` desc';
        }

        if ($ordering == 'popular') {
            $query[] = ' ORDER BY `cnt` desc';
        }

        if ($ordering == 'alphabet') {
            $query[] = ' ORDER BY a.`title` asc';
        }

        if ($ordering == 'latest') {
            $query[] = ' ORDER BY a.`created` desc';
        }

        $query = implode(' ', $query);
        $db->setQuery($query);
        $children = $db->loadObjectList();
        $ccounter = 0;

        // Recursion happens here
        if ($children) {
            $this->getChildCategories($children, $categories[$row->id]->childs, ++$level);
        }
    }
}

Может кто-нибудь объяснить мне, как изменить запрос к БД? Выход сейчас есть:

Category
-Child Cat
--Grandchild Cat
-Child Cat

Я хочу:

Category
-Child Cat
-Child Cat
У вопроса есть решение - Посмотреть?

https://stackoverflow.com/questions/56019929/how-can-i-exclude-grandchildren-from-my-recursive-querying-process#comment98683852_56019929
Я не понимаю. Вы построили функцию PHP с рекурсией, почему вы хотите использовать ограничение в MySQL? Вы можете использовать переменную $level для проверки глубины в PHP. Лучший совет, который я могу дать, - это избегать рекурсии. Если вы едва понимаете свой код сейчас, вы не будете вообще, когда вы читаете через год.
https://stackoverflow.com/questions/56019929/how-can-i-exclude-grandchildren-from-my-recursive-querying-process#comment98683980_56019929
Я не строил функцию, ее из системы, которую я использую. Я пытаюсь изменить свой сайт. Я подумал о переменной $level. Если я ограничу его до 1, он должен работать. Но это не так. Может быть, я застрял на этой идее
https://stackoverflow.com/questions/56019929/how-can-i-exclude-grandchildren-from-my-recursive-querying-process#comment98746360_56019929
Спасибо за ваш ответ. Я попробую это сделать. Нет это не исходит непосредственно из easyblog, которые это на странице сборка плагинов Квикс.
https://stackoverflow.com/questions/56019929/how-can-i-exclude-grandchildren-from-my-recursive-querying-process#comment98854035_56019929
Спасибо микмакуса! Ваши решения прекрасно работают!

Ответы - Как я могу исключить внуков из моего рекурсивного процесса запроса? / How can I exclude grandchildren from my recursive querying process?

Является ответом!
youwhatmate

29.08.2019 03:49:37

Комментарий от пользователя mickmackusa решает проблему. Его решение работает отлично!

if ($children && $level < 2) { 
    $this->getChildCategories($children, $categories[$row->id]->childs, $level + 1); 
}
Закрыть X