如何使用laravel来处理分类

6 浏览
0 Comments

如何使用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

它出错了。

0
0 Comments

问题的原因是在Blade视图中创建了助手函数,而不应该这样做。应该在外部的php文件中创建助手函数。解决方法是创建一个php文件,在其中定义函数,然后更新composer.json文件以使用该文件,最后在Blade视图中使用该函数。

0