📜  laravel 中的多级子类别 (1)

📅  最后修改于: 2023-12-03 15:32:34.208000             🧑  作者: Mango

Laravel 中的多级子类别

在 Laravel 中,我们经常需要对数据进行分类和归类。在某些情况下,需要对数据进行多层级的分类,以此来更加细致地管理、查询和展示数据。Laravel 提供了多种方法来实现多级子类别的功能。

数据表设计

在实现多级子类别之前,我们需要先设计相应的数据表。常见的做法是使用递归关系来设计数据表,即在数据表中添加一个对自身的外键。比如,我们需要设计一个商品分类的数据表,可以这样设计:

CREATE TABLE `categories` (
    `id`            INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
    `parent_id`     INT(10) UNSIGNED DEFAULT NULL,
    `name`          VARCHAR(255)     NOT NULL,
    PRIMARY KEY (`id`),
    FOREIGN KEY (`parent_id`) REFERENCES `categories`(`id`)
);

上面的设计中,categories 表中的 parent_id 字段指向 categories 表自身的 id 字段,用于表示分类之间的上下级关系。

模型关系定义

在 Laravel 中,我们可以使用 Eloquent 模型来定义数据表的关系。在定义模型关系时,我们需要在 Category 模型中添加一个对自身的关系定义,示例代码如下:

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

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

上面的代码中,parent() 方法定义了当前分类所属的上级分类,children() 方法定义了当前分类所包含的下级分类。

查询数据

有了模型关系定义之后,我们就可以方便地查询多级子类别的数据了。比如,我们要查询所有二级分类下的商品数量,可以使用如下代码:

$categories = Category::whereHas('children', function ($query) {
    $query->whereHas('products');
})->get();

上面的代码中,whereHas() 方法表示查询拥有特定关联关系的模型,也就是说,我们要查询拥有下级分类和商品的分类。whereHas('products') 表示查询拥有商品的分类。最终我们可以得到所有二级分类的数量以及包含的商品数量。

总结

多级子类别的实现在 Laravel 中非常简单,只需要合理设计数据表和定义模型关系即可。在实际开发中,我们需要根据具体的业务场景来进行调整和优化,以达到更好的效果。