PHP实现JSON层级分类导入MySQL树形结构时父ID为空如何解决
核心问题
你代码的问题出在两个地方:
- 仅在插入新分类的时候才更新父级标识,已存在的分类不会更新父级标识。处理第二条分类
Clothes - Pants - Chinos时,前两层Clothes、Pants已经在数据库中,不会进入插入逻辑,$previous_value始终停留在初始值0,插入Chinos时拿错误的父级参数查询得到NULL。 $previous_value变量混用了数字(初始0)和分类名字符串,和你调用的Get_Taxonomy_Id方法入参逻辑不匹配,容易出现参数错误。
修复方案
你不需要拆分单层/多层分类的处理逻辑,统一按层级遍历即可,每层不管分类是否已存在,都要更新父级ID供下一层使用:
<?php include_once('../../../products/categories.inc.php'); $string = file_get_contents("../products/products.json"); $json_decode = json_decode($string, true); foreach ( $json_decode as $keys ) { $category = $keys['productCategory']; $split = explode( '-', $category ); $categories = array_map('trim', $split); $parent_id = 0; // 统一存储父级ID,初始为顶级分类父ID0 foreach ( $categories as $value ) { $tax_obj = new Insert_Taxonomy; $exists_id = $tax_obj->Exists_Taxonomy_Name($value); if ( empty($exists_id) ) { // 分类不存在,插入新分类 $args = array($value, $parent_id, 'category'); $current_id = $tax_obj->create_taxonomy($args); } else { // 分类已存在,直接取已有ID $current_id = $exists_id; } // 把当前分类ID设为下一层的父ID $parent_id = $current_id; } }
注意调整你封装的方法逻辑:
Exists_Taxonomy_Name方法传入分类名称,存在则返回对应taxonomy_id,不存在返回false/0create_taxonomy方法插入完成后返回新生成的taxonomy_id
如果你的Exists_Taxonomy_Name原来只返回布尔值,那已存在的分支需要额外调用查询拿ID:
// 分类已存在时的逻辑 $current_id = $tax_obj->Get_Taxonomy_Id($value);
内容的提问来源于stack exchange,提问作者fredriktv
相关产品推荐
相关产品推荐

