如何让所有属于父母的孩子都能说服?

时间:2016-07-05 04:35:22

标签: laravel eloquent

在我的数据库中,我有一个Categories表。类别可以具有父类别,使其成为递归关系

我也有产品表。每种产品属于一个类别。

比如说,我有一棵看起来像这样的树:

Category
    Sub-Category 1
        Sub-Sub-Category 1
            Product 1
            Product 2
            Product 3
            Product 4
        Sub-Sub-Category 2
            Product 5
            Product 6
            Product 7
            Product 8
    Sub-Category 2
        Sub-Sub-Category 3
            Product 9
            Product 10
            Product 11
            Product 12

如果我$SubCategory1->products,我希望它能给我产品1-8

如果我$SubSubCategory3->products,我希望它能给我产品9-12

如果我$Category->products,我希望它能给我所有产品

基本上,我希望该类别能够提供属于它的所有产品

8 个答案:

答案 0 :(得分:5)

假设您的模型名称是Category

在类别模型上创建一个函数

public function children() { return $this->hasMany('App\Category', 'parent_id', 'id'); }

在控制器上使用上述方法

$categories = Category::with('children')->where('parent_id',0)->get();

答案 1 :(得分:3)

在希望找到一个很好地使用Laravel的答案之后,我最终放弃了,只是编写代码来做我想做的事情,结果比我预期的要小。

public function all_products()
{
    $products = [];
    $categories = [$this];
    while(count($categories) > 0){
        $nextCategories = [];
        foreach ($categories as $category) {
            $products = array_merge($products, $category->products->all());
            $nextCategories = array_merge($nextCategories, $category->children->all());
        }
        $categories = $nextCategories;
    }
    return new Collection($products); //Illuminate\Database\Eloquent\Collection
}

答案 2 :(得分:2)

请尝试以下Has Many Through关系并发布结果

class Category extends Model
{
    public function products()
    {
        return $this->hasManyThrough(
            'App\Product', 'App\Category',
            'parent_id', 'catergory_id', 'id'
        );
    }
}

然后您可以使用$category->products;查找您的商品

答案 3 :(得分:2)

这种方式效果很好:

class One extends Model {
    public function children()
    {
        return $this->hasMany(self::class, 'parent_id');
    }

    public function grandchildren()
    {
        return $this->children()->with('grandchildren');
    }
}

答案 4 :(得分:0)

您最好使用嵌套集模型。您应该使用此数据结构,因为它可以通过一种简单的方法在mysql中获得最快的查询方法。仅具有parent_id属性,您不知道树的深度,这在知道需要多少个联接时会产生问题。 我为您提供这篇出色的文章。 managing-hierarchical-data-in-mysql

对于那些使用laravel框架的人,我更喜欢建议这个惊人的软件包:Baum

答案 5 :(得分:0)

对于在此处搜索此答案的任何人来说,这是一个简单的解决方案:

class Group extends Model
{
  public function ancestry() 
  {
   return $this->belongsTo('App\Group', 'parent_id')->with('ancestry'); 
  }

  public function descent() 
  {
    return $this->hasMany('App\Group', 'parent_id')->with('descent'); 
  }
}

ancestry 函数会给你根的路径,descent 会给你所有的后代节点。

答案 6 :(得分:0)

我在表(用户)中创建了 managed_by 并且这个解决方案获得了所有无限级别的孩子。

在用户模型中

 public function Childs(){
        return $this->hasMany('App\User', 'managed_by', 'id')->with('Childs');
    }

在帮助文件中(我的魔法解决方案)

if (!function_exists('user_all_childs_ids')) {
        function user_all_childs_ids(\App\User $user)
        {
            $all_ids = [];
            if ($user->Childs->count() > 0) {
                foreach ($user->Childs as $child) {
                    $all_ids[] = $child->id;
                    $all_ids=array_merge($all_ids,is_array(user_all_childs_ids($child))?user_all_childs_ids($child):[] );
                }
            }
            return $all_ids;
        }
    }

答案 7 :(得分:-1)

说$ category_id = Category-> id,并且您希望将某个产品集合作为该类别的子项,我会尝试:

$ products = App \ Product :: with(['SubSubCategory.SubCategory.Category'=> function($ query)use($ category_id){$ query-> where('id',$ category_id);}] )-> get();

能够这样做。您将需要这样的“一对多”逆关系:

// App \ SubCategory

公共函数Category(){返回$ this-> belongsTo('App \ Category');}

// App \ SubSubCategory

公共函数Sub_Category(){返回$ this-> belongsTo('App \ SubCategory');}

// App \产品

公共函数SubSubCategory(){返回$ this-> belongsTo('App \ SubSubCategory');}

祝你好运。