gpt4 book ai didi

php - MySQL/PHP - 多层类别结构

转载 作者:行者123 更新时间:2023-11-29 03:25:51 25 4
gpt4 key购买 nike

我正在构建一个包含产品数据库的网站。每个产品都属于一个类别。类别的结构是多层的,可以包含任意数量的层,例如:

  • 电子产品 > 游戏机 > Xbox > Xbox One > 游戏 > 等..
  • 时尚 > 男士 > 衬衫 > 长袖

我总是将产品分配到层中的“最后”类别。

这是我的类别表的结构:

id       name            parent_id
================================
1 Fashion NULL
2 Mens 1
3 Shirts 2
4 Long Sleeved 3
5 Short Sleeved 3

我使用 Yii2 作为我的应用程序框架,但相同的概念应该适用于大多数 MVC 框架,或者至少适用于那些实现 ORM(如 ActiveRecord)的框架。

我想做的是:

  1. 对于任何类别级别,获取“主”父级。 IE。对于 Shirts,它将是 Fashion
  2. 对于任何类别级别,获取该层中的所有“最后”级别类别。 IE。对于男装,它将是长袖短袖
  3. (更高级)对于任何类别级别,找出它拥有的 child / parent 的数量。

我的模型中有以下默认关系:

public function getParent()
{
return $this->hasOne(Category::className(), ['id' => 'parent_id']);
}

public function getParent()
{
return $this->hasMany(Category::className(), ['parent_id' => 'id']);
}

以下是我创建的一个函数,它输出任何给定类别的“树”:

public function getParentTree()
{
$array = [];

// $this->parent refers to the 'getParent()' relation above
if(!empty($this->parent))
{
$array[] = $this->parent->name;

if(!empty($this->parent->parent))
$array[] = $this->parent->parent->name;

if(!empty($this->parent->parent->parent))
$array[] = $this->parent->parent->parent->name;
}
else
$array[] = "(none)";

$output = implode(" --> ", array_reverse($array));

return $output;
}

但是这里有很多重复,看起来很难看。但这也让我相信也许我采取了错误的方法并且需要重组数据库本身?

最佳答案

Bill 我想我已经在 YII2 -> 模型中解决了这个问题。

下面是我的代码。

public static function getSubCategories($parent_id = NULL, $level = 0)
{
// Get the Category from table
// Here you can use caching Yii::$app->cache->get to avoid multiple queries
$categories = Category::find()->select(['id', 'parent_id', 'name'])->where(['parent_id' => $parent_id])->asArray()->all();

// Logic of Nth level to return
self::$max_down_level += 1;
if($level != 0 && self::$max_down_level > $level) return $categories;

// Now for each sub categories find and return chidren as Array
foreach($categories as $key => $category)
{
$categories[$key]['children'] = self::getSubCategories($category['id'], $level);
}

return $categories;
}

另外不要忘记在您的模型类中声明 public static $max_down_level = 0; 变量。现在调用如下函数。

  1. 获取父类的所有子类 self::getSubCategories(NULL)
  2. 让所有 child 都达到第 2 级 self::getSubCategories(NULL, 2)

与上面相同,您可以声明递归函数以获取父类别。

public static function getParentCategories($parent_id, $level = 0)
{
// Get the Category from table
// Here you can use caching Yii::$app->cache->get to avoid multiple queries
$categories = Category::find()->select(['id', 'parent_id', 'name'])->where(['id' => $parent_id])->asArray()->all();

// Logic of Nth level to return
self::$max_up_level += 1;
if($level != 0 && self::$max_up_level > $level) return $categories;

foreach($categories as $key => $category)
{
$categories[$key]['parent'] = self::getParentCategories($category['parent_id'], $level);
}

return $categories;
}

另外不要忘记在模型类中声明 public static $max_up_level = 0; 变量。现在调用如下函数。

  1. 获取父类的所有子类 self::getParentCategories(16, 0)
  2. 让所有 child 都达到第 2 级 self::getParentCategories(16, 2)

你可以使用你自己的类名而不是self

希望这对您有所帮助。

关于php - MySQL/PHP - 多层类别结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36412211/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com