Laravel从无限嵌套类别中获取所有产品

时间:2016-08-23 06:00:16

标签: laravel eloquent laravel-5.2

我有类别模型,其中每个类别可以是通用的或嵌套的。

类别: ID PARENT_ID 标题

要使类别的子项和类别的所有嵌套子项与递归使用关系

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

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

产品关系

    public function product()
{
    return $this->belongsToMany('App\Models\Product', 'categories_products');
}

如何从基本类别和所有嵌套类别中获取所有产品?

1 个答案:

答案 0 :(得分:0)

如果你不关心性能这样的事情应该有效(未经过测试),但如果你有非常复杂的类别树,它可能会产生很多查询。

$products = Category::getAllProducts($categoryId);

public static function getAllProducts($categoryId, $products = null)
{
  if ($products === null) {
     $products = collect();   
  }
  $category = Category::find($categoryId); 
  $products = $products->merge($category->product);
  $category->children->each(function($child) {
      $products = self::getAllProducts($child->id, $products);
  });

  return $products;
}

作为替代方案,您可以首先找到所有类别,然后找到属于这些类别的产品,假设您没有获得数百个类别,因为如果您不使用原始查询,可能会导致PDO绑定问题。