如何使用laravel来处理分类
如何使用laravel来处理分类
我大约一个月前开始了一个项目,并创建了一个简单的表结构来处理类别,其中包含“自引用关联”,如果可以这样称呼的话。
这个模型本身也非常简单。
这个工作很顺利,但是现在我需要一些在这种表结构下很难实现的功能。顺便说一下,只有叶子类别或最终类别包含产品/项目。没有要求通过在树的中间位置获取产品。只需要获取该类别节点和以下的产品总数。
以下是无法完成的事情(或者我还没有弄清楚如何完成):
- 计算从根类别到叶子类别的总产品数。
- 在类别树的中间位置着陆并计算到叶子类别的产品数。
- 当产品处于非活动状态时(我有全局和本地作用域来控制),某些类别的子类别将为空。这些子类别不应该在界面上显示或从数据库中获取。
另外,请记住,我目前有7个根或顶级类别,树形展开或将其视为7个类别和子类别的分支。这7个根类别没有parent_id,它要么为空,要么为0,表示它们不属于“主”父类别。
Product.php
class Product extends Model
{
public function category()
{
return $this->belongsTo(Category::class); // products表有category_id列
}
}
一些预期的结果是像下面这样的。着陆在“index”应该呈现7个类别(或任意数量的根类别)和总产品数。
- 类别1(600个产品)
- 类别2(500个产品)
- ...
- 类别n(x个产品)
如果您着陆在类别树的中间位置,它应该有类似的功能。
以类别1为例,它的直接子类别也不是叶子类别,而是其他类别的父类别。
等等,我希望这样说得通。
不要求像那样“展开”,我只是为了简单起见和理解结构,将子类别放在子类别中。无论何时着陆在树的中间位置,都只需要呈现该类别节点的直接子类别,并显示总产品数(包括着陆父类别)。
例如:
如果着陆在类别1上,只需呈现直接子类别。
父类别的标题:父类别名称(X个产品)
- 子类别1(x个产品)
- 子类别2(x个产品)
- ...
- 子类别n(x个产品)
我的类别结构可能非常深入,非常详细,必须非常非常具体。我总共有3200个类别,包含2.4百万个产品,如果您担心性能问题。有些类别完全为空,但是它们等待填充。
在这种单表结构下是否可能实现我所需的功能?我感到很困惑,无法想出解决方法。
对于这篇长文,我很抱歉,希望有人能帮我解决这个问题。
Controller.php
public function index(Request $request)
{
$query = Category::ofType($this->type)->with('parent')->with('products')->orderBy('title');
if ($request->filled('search')) {
if (is_numeric($request['search'])) {
$query->where('id', 'LIKE', "%${request['search']}%");
} else {
$query->where('title', 'LIKE', "%${request['search']}%");
$query->orWhereHas('parent', function ($query) use ($request) {
return $query->where('title', 'LIKE', "%${request['search']}%");
});
}
}
return view('category::admin.index', [
'categories' => $query->paginate(20)->appends($request->except('page')),
]);
}
index.blade.php
@php
function plusCountCategory(&$category) {
foreach ($categories as $category) {
if (!!$category["parentId"]) {
$category["count"] = $category["count"] + 1;
plusCountCategory($category["parentId"]);
}
}
}
@endphp
它出错了。