使用Laravel获取父子数据(树复选框)

时间:2018-06-08 03:07:06

标签: php laravel

我试图从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下获取所有父母ID和子ID。谢谢!

编辑:数据库示例如下。

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 :(得分:2)

实际上,您可以定义父子关系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);

希望它有所帮助。

答案 1 :(得分:0)

通过修改功能来解决问题...希望它对其他人有用。

Joi.Object