创建子母公司 Laravel 的无限嵌套层次结构数组



我有一个表company_basics其中有parent_id,这种子父关系可以不受限制。

目前,我的代码是

$company = AppCompanyBasic::whereRaw('user_id = ' . Auth::user()->id . " AND parent_id = 0")->get();

//                echo "<pre>";
//                print_r($company);
//                echo "</pre>";
$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 = AppCompanyBasic::whereRaw('user_id = ' . Auth::user()->id . " AND parent_id = '" . $single_company->id . "'")->get();
    $child_count = 0;
    foreach($child_company as $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 "company id: " . $single_company->id . "<br>";
    $count++;
}

我只得到父母,然后循环通过他们找到孩子,但这是下一级,但我想无限层下降。

现在返回的代码是

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
        )
)

正如@rypskar建议的那样,你应该使用递归。

我建议你使用匿名函数,它将在其中使用自身(称为closure),并做这样的事情:

 $userId = Auth::user()->id;
 $getChildOf = function ($parent) use ($userId, &$getChildOf) {
        $company   = AppCompanyBasic::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 查询注入变量是不安全的,被认为是一种不好的做法。您应该考虑使用预准备语句

最新更新