构建无限类别深度的面包屑 – PHP SQL
作者:互联网
我希望能够为内容页面构建面包屑,但是一段内容所包含的类别可以具有无限的深度,所以我不确定如何在不逐个获取每个类别的情况下再进行操作得到它的父母等似乎它可能是一个更简单的方式,但我无法弄明白.
我有一篇文章表
article_id
article_name
article_cat_id
我也有一个类别表
cat_id
cat_name
cat_parent
猫父母是另一类别的id,其中一个类别是孩子.
想象一篇文章有5个类别,据我所知,我必须构建像这样的面包屑(示例代码显然输入应该被转义等)
<?php
$breadcrumbs = array(
'Category 5',
'Content Item'
);
$cat_parent = 4;
while($cat_parent != 0) {
$query = mysql_query('SELECT * FROM categories WHERE cat_id = '.$cat_parent);
$result = mysql_fetch_array($query, MYSQL_ASSOC);
array_unshift($breadcrumbs, $result['cat_name']);
$cat_parent = $result['cat_parent'];
}
?>
这会给我
array(
'Category 1',
'Category 2',
'Category 3',
'Category 4',
'Category 5',
'Content Item'
)
哪些我可以用于我的面包屑,但它带我5个查询来做它,这不是真的更好.
谁能提出更好的解决方案?
解决方法:
以下是一些简单易用的选项:
>坚持您的设计,使用递归/迭代方法,享受简单代码的好处.真的,这将带你走得很远.作为奖励,从更复杂的设置更容易从这里转移到更高性能的东西.
>如果类别的nr不是很大,您可以选择所有类别并在PHP中构建层次结构.由于页面大小,获取1行所需的工作量与其中的一大堆(比如几百)完全相同.这最大限度地减少了查询/网络跳闸的次数,但增加了通过电缆传输的数据量.测量!
>缓存层次结构并在每X单位时间或每当添加/修改/删除类别时完全重新加载.在它最简单的形式中,缓存可以是一个PHP文件,其中包含整个类别层次结构的嵌套变量结构,以及节点的简单索引.
>创建一个附加表,在该表中以某种方式展平了层次结构,使用嵌套集,路径枚举,闭包表等.将使用类别表上的触发器维护该表.
我会选择(1),除非你相当肯定在不久的将来你会有每秒几个用户的持续负载. (每秒1个用户每月访问量达到250万次).
简单的代码没有错.使代码变得复杂并不明显是错误的.
标签:php,mysql,sql,breadcrumbs 来源: https://codeday.me/bug/20190621/1255325.html