我有类别模型,其中每个类别可以是通用的或嵌套的。
类别: 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');
}
如何从基本类别和所有嵌套类别中获取所有产品?
答案 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绑定问题。