当前位置: 首页 > 知识库问答 >
问题:

如何与laravel协商类别

壤驷兴朝
2023-03-14

我大约一个月前开始了一个项目,创建了一个简单的表结构,用于处理带有“自引用关联”的类别(如果可以这样称呼的话)。

public function up()
{
    Schema::create('categories', function (Blueprint $table) {
        $table->id();
        $table->foreignId('parentId')->nullable()->constrained('categories')->cascadeOnDelete();
        $table->unsignedBigInteger('guildId')->nullable();
        $table->string('title');
        $table->bigInteger('count')->default(0);
        $table->string('type')->default('product')->index();
        $table->string('slug')->unique();
        $table->text('description')->nullable();
        $table->text('full_description')->nullable();
        $table->unsignedBigInteger('sort_order')->nullable();
        $table->foreignId('thumbnailId')->nullable()->constrained('files')->nullOnDelete();
        $table->enum('status', ['disabled', 'enabled'])->default('enabled');
        $table->timestamps();
    });
}

模型本身也非常简单。

public function parent()
{
    return $this->belongsTo(Category::class, 'parentId');
}

public function parents()
{
    return $this->belongsTo(Category::class, 'parentId')->with('parents');
}

public function children()
{
    return $this->hasMany(Category::class, 'parentId');
}

public function products()
{
    return $this->hasMany(Product::class, 'rootCategoryId');
}

public function allProducts()
{
    return $this->belongsToMany(Product::class, 'category_product', 'categoryId', 'productId');
}

这很好,但我现在需要一些功能,很难使它与这种表结构一起工作。顺便说一句,只有叶类别或最终类别包含产品/项目。三没有要求通过着陆在树的中部来获取产品。仅显示该类别节点及其下的产品总数。

什么是不能做的(或者我还不知道怎么做)

  • 从根类到叶类的总产品计数。
  • 降落在类别树的中间,并从叶子类别子级向下(或向上)计数产品。
  • 当产品处于非活动状态时(我有全局和本地范围),某些类别的子级将是空的。这些不能显示或从数据库中获取。

另外,请记住,我目前有7个根类别或顶类别,树从中展开,或将其视为类别和子类别的7个分支。这7个根没有父\u id,它要么为null,要么为0,这意味着它们不属于“主”父。

产品php

class Product extends Model
{
    public function category()
    {
        return $this->belongsTo(Category::class); // products table has the category_id column
    }
}

一些预期结果如下。登陆“索引”应该呈现7个类别(或任何数量的根类别)的总产品计数。

  • 第1类(600商品)
  • 第1类(500商品)
  • ...
  • 第n类(x产品)

如果你在类别树的中间登陆,它应该起到类似的作用。

从第1类开始,我们假设它是直系子女,这也不是叶子类别,而是其他人的父母。

等等,我希望这是有意义的。

它也不需要像那样“展开”,我只是为了简单和理解结构而把孩子的孩子放在这个例子里。当您降落在树的中间时,它只需要呈现该类别节点的直接子节点,并计算总产品(包括着陆的父节点)

例如:

如果落在类别1上,则仅渲染直接子级

母公司名称:母公司类别名称(X产品)

  • 儿童1(x产品)
  • 儿童2(x产品)
  • 儿童n(x产品)

我的分类结构可以非常深入,非常详细,而且要求非常具体。我总共有3200个类别,包含240万种产品。如果您想知道性能问题。有些类别完全是空的。但是,还有很多东西等着被填满。

这个单表结构能满足我的要求吗?我觉得自己被烧坏了,想不出办法来解决这个问题。

抱歉发了这么长的帖子,我希望有人能帮我解决这个问题。

控制器。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')),
    ]);
}

指数刀身php

@php
    function plusCountCategory( &$category ) {
    foreach($categories as $category){
    
    if( !! $category["parentId"] )
    {
    $category["count"] = $category["count"] + 1 ;
    plusCountCategory($category["parentId"] ) ;
    }
    }
    }
@endphp

它有一个错误

共有1个答案

洪俊能
2023-03-14

这里的问题是,在刀片视图中创建辅助函数。你不应该这样做。您应该改为在外部php文件中创建helper函数

 类似资料:
  • 我刚刚迁移到最新的spring Boot2.0.1.Release,并开始使用云版本“finchley.rc1”。我正在使用consul作为配置和服务注册表/发现服务器。但一旦我启动应用程序,它就会尝试从“localhost:8888”加载配置,这是针对Eureka的。我在application.properties中配置了领事主机和端口,但仍然看到相同的行为。 通过搜索,我发现spring cl

  • Apache支持HTTP/1.1规范中定义的内容协商,它可以根据浏览器提供的参数选择一个资源最合适的媒体类型、语言、字符集和编码的表现方式。它还实现了一些对浏览器发送不完整内容协商信息进行智能处理的能力。 内容协商由mod_negotiation模块支持,并被默认编译进服务器。 关于内容协商(Content Negotiation) 一个资源可能会有多种不同的表现形式,比如,可能会有不同语言或者媒

  • You can configure how Spring MVC determines the requested media types from the request. The available options are to check the URL path for a file extension, check the "Accept" header, a specific quer

  • 内容提要 本章主要讲解了一种机制————同样的url,客户端和服务器之间如何根据客户端的需要发送适当的版本文档给客户端,比如同样在浏览器输入www.baidu.com,那么如果是英国的用户很可能希望收到的收到的是英语版本的网页,而在中国的用户很可能希望收到中文版本的网页,那么服务器是怎么实现根据需要发送不同的版本的呢!于是有了内容协商和转码!所谓内容协商指的是客户端和服务器通过在http报文设置相

  • 主要内容:关于内容协商Apache HTTPD支持规范中描述的内容协商。它可以根据浏览器提供的媒体类型,语言,字符集和编码首选项,选择资源的最佳表示形式。它还实现了一些功能,可以更智能地处理来自发送不完整协商信息的浏览器的请求。 内容协商由模块提供,该模块默认编译。 关于内容协商 资源可以以多种不同的表示形式提供。例如,它可能以不同语言或不同媒体类型或组合形式提供。选择最合适选择的一种方法是为用户提供索引页面,然后让他

  • 内容协商是基于客户端或服务器偏好选择多种可能的表示之一以返回客户端的过程。 确定接受的渲染器 REST framework 根据可用的渲染器,每个渲染器的优先级以及客户端的 Accept: header,使用简单的内容协商风格来确定应将哪些媒体类型返回给客户端。所使用的风格部分由客户端驱动,部分由服务器驱动。 更具体的媒体类型优先于较不特定的媒体类型。 如果多种媒体类型具有相同的特性,则优先根据为