Создать неограниченный вложенный иерархический массив дочерней родительской компании Laravel - PullRequest
0 голосов
/ 14 января 2019

У меня есть таблица company_basics, в которой есть parent_id, и эти дочерние и родительские отношения могут быть неограниченными.

В настоящее время мой код

<code>$company = \App\CompanyBasic::whereRaw('user_id = ' . Auth::user()->id . " AND parent_id = 0")->get();


//                echo "<pre>";
//                print_r($company);
//                echo "
"; $ companies = array (); $ count = 0; foreach ($ company as $ single_company) { $ companies [$ count] ['id'] = $ single_company-> id; $ companies [$ count] ['comp_name'] = $ single_company-> comp_name; $ child_company = \ App \ CompanyBasic :: whereRaw ('user_id ='. Auth :: user () -> id. "AND parent_id = '". $ single_company-> id. "'") -> get (); $ child_count = 0; foreach ($ child_company как $ single_child_company) { $ companies [$ count] ['child'] [$ child_count] ['id'] = $ single_child_company-> id; $ companies [$ count] ['child'] [$ child_count] ['comp_name'] = $ single_child_company-> comp_name; $ Child_count ++; } echo "id компании:". $ single_company-> id. "
"; $ Подсчитывать ++; }

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

Код возврата сейчас

Array
(
    [0] => Array
        (
            [id] => 2
            [comp_name] => Habib company
            [child] => Array
                (
                    [0] => Array
                        (
                            [id] => 16
                            [comp_name] => Child Company
                        )

                    [1] => Array
                        (
                            [id] => 18
                            [comp_name] => Child Company
                        )

                )

        )

    [1] => Array
        (
            [id] => 15
            [comp_name] => Adjacent Company
        )

    [2] => Array
        (
            [id] => 17
            [comp_name] => MSB34
        )

)

1 Ответ

0 голосов
/ 14 января 2019

Как подсказал @rypskar, вы должны использовать рекурсию.

Я предлагаю вам использовать анонимную функцию , которая будет использовать себя внутри нее (которая называется closure) и делать что-то вроде этого:

 $userId = Auth::user()->id;

 $getChildOf = function ($parent) use ($userId, &$getChildOf) {

        $company   = \App\CompanyBasic::whereRaw('user_id = ' . $userId . " AND parent_id = " . $parent)->get();
        $companies = false;

        if ($company->isNotEmpty()) {
            $companies = array();

            foreach ($company as $single_company) {
                $companies[] = array(
                    'id'        => $single_company->id,
                    'comp_name' => $single_company->comp_name,
                    'child'     => $getChildOf($single_company->id),
                );
                echo "company id: " . $single_company->id . "<br>";
            }
        }

        return $companies;
  };

 $companies = $getChildOf(0);

Здесь анонимная функция передается переменной $getChildOf, которая используется для себя.

Я удалил вашу переменную $count, чтобы упростить код.

Кстати, вы должны понимать, что этот код будет формировать запрос к базе данных на каждой итерации, что существенно увеличит нагрузку на сервер

Кроме того, внедрение переменных в запросы SQL с конкатенацией небезопасно и считается плохой практикой. Вам следует рассмотреть возможность использования подготовленных заявлений

...