Получение родительских и дочерних данных (Tree Checkbox) с Laravel - PullRequest
0 голосов
/ 08 июня 2018

Я пытаюсь получить все родительские и дочерние данные из базы данных с помощью Laravel.Внутри родителя также будут вложенный родитель и ребенок.Это как многоуровневая вещь.Проблема, с которой я сталкиваюсь, заключается в получении всей этой информации с помощью цикла.Ниже приведен мой код.

$totalchild = self::getParentChildren($parent->id);

public function getParentChildren($parent) {
    $totalChild = array();
    $child = Permission::where('status', 1)->where('parentid', '=', $parent)->pluck('permissionid')->toArray();
    $totalChild = $child;
    foreach($child as $childs){
        $innerChild[] = self::getChildren($childs);
        $totalChild = array_push($totalChild, $innerChild);
    }

    return $totalChild;
}

Ошибка, которую я получаю: «array_push () ожидает, что параметр 1 будет массивом, заданным целым числом».Я понятия не имею, что там пошло не так.По сути, я пытаюсь получить все родительские и дочерние удостоверения под этим одним родительским удостоверением.Спасибо!

РЕДАКТИРОВАТЬ: Пример базы данных, как показано ниже.

id    name        parentid
1     master      0
2     parent A    1          
3     parent B    1
4     child A     2
5     child B     2
6     child C     3
7     child A_A   4
8     child A_B   4

, поэтому предположим, что я хочу получить всех родителей и детей под этим основным идентификатором родителей 1.

ОБНОВЛЕНИЕ КОДАЯ придумал еще один, но я не знаю, почему он возвращает мне только первый слой.Это не вернуло мне всех родителей и детей под ним.

public function getChildren($parent, $tree_string=array()) {
    $tree = array();
    $tree = Permission::where('status', 1)->where('parentid', $parent)->pluck('permissionid')->toArray();
    if(count($tree)>0 && is_array($tree)){
        $tree_string=array_merge($tree_string,$tree);
    }
    foreach ($tree as $key => $value) {
        self::getChildren($value, $tree_string);
    }
    return $tree_string;
}

$totalchild = self::getChildren($parent->id); // returns me the first layer only

Ответы [ 2 ]

0 голосов
/ 08 июня 2018

Решил проблему, изменив функцию ... надеюсь, она будет полезна другим людям.

public function getChildren($parent) {
    $tree = Array();
    if (!empty($parent)) {
        $tree = Permission::where('status', 1)->where('parentid', $parent)->pluck('permissionid')->toArray();
        foreach ($tree as $key => $val) {
            $ids = self::getChildren($val);
            if(!empty($ids)){
                if(count($ids)>0) $tree = array_merge($tree, $ids);
            }
        }
    }
    return $tree;
}
0 голосов
/ 08 июня 2018

На самом деле вы можете определить родительские дочерние отношения n Eloquent модель.

// app/Category.php
class Category extends Model
{
    ...
    // Define Eloquent parent child relationship
    public function parent() {
        return $this->belongsTo(self::class, 'parent_id');
    }

    // for first level child this will works enough
    public function children() {
        return $this->hasMany(self::class, 'parent_id');
    }

    // and here is the trick for nestable child. 
    public static function nestable($categories) {
       foreach ($categories as $category) {
           if (!$category->children->isEmpty()) {
               $category->children = self::nestable($category->children);
            }
        }

        return $categories;
    }
    ...
}

Пример использования:

// Get all parent top level category
$categories = Category::where('parent_id', 0);

// Get nestable data
$nestable = Category::nestable($categories);

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...