You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP实现JSON层级分类导入MySQL树形结构时父ID为空如何解决

核心问题

你代码的问题出在两个地方:

  1. 仅在插入新分类的时候才更新父级标识,已存在的分类不会更新父级标识。处理第二条分类Clothes - Pants - Chinos时,前两层Clothes、Pants已经在数据库中,不会进入插入逻辑,$previous_value始终停留在初始值0,插入Chinos时拿错误的父级参数查询得到NULL。
  2. $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/0
  • create_taxonomy方法插入完成后返回新生成的taxonomy_id

如果你的Exists_Taxonomy_Name原来只返回布尔值,那已存在的分支需要额外调用查询拿ID:

// 分类已存在时的逻辑
$current_id = $tax_obj->Get_Taxonomy_Id($value);

内容的提问来源于stack exchange,提问作者fredriktv

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 21:24:06