如何用PHP将Sortable & Nestable分类数据存入数据库?
如何将嵌套Sortable/Nestable数据存入PHP数据库
你的数据库表采用的是邻接表模型(通过parent_id关联父节点),刚好匹配Sortable/Nestable生成的嵌套树形结构。下面是具体实现步骤和示例代码:
1. 解析JSON数据
首先把前端传来的JSON字符串转换成PHP关联数组:
$jsonStr = '[ { "id": "1", "children": [ { "id": "2", "children": [{"id": "3"},{"id": "4"},{"id": "5"},{"id": "6"},{"id": "7"},{"id": "8"},{"id": "9"},{"id": "10"}] }, { "id": "11", "children": [{"id": "12"},{"id": "14"},{"id": "13"},{"id": "15"},{"id": "16"}] } ] } ]'; $treeNodes = json_decode($jsonStr, true);
2. 递归遍历并插入数据库
通过递归函数遍历每个节点,将节点ID、标题(需根据实际情况补充)和父节点ID存入数据库。以下是PDO实现示例:
// 初始化数据库连接(替换为你的实际配置) $pdo = new PDO('mysql:host=localhost;dbname=你的数据库名', '用户名', '密码'); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // 递归插入节点函数 function saveTreeNodes($nodes, $parentId = 0, $db) { foreach ($nodes as $node) { // 若JSON包含title字段,直接使用$node['title'];否则自行生成 $itemTitle = "节点 " . $node['id']; // 插入当前节点 $stmt = $db->prepare("INSERT INTO 你的表名 (id, title, parent_id) VALUES (:id, :title, :parent_id)"); $stmt->execute([ ':id' => $node['id'], ':title' => $itemTitle, ':parent_id' => $parentId ]); // 递归处理子节点 if (!empty($node['children'])) { saveTreeNodes($node['children'], $node['id'], $db); } } } // 执行插入 saveTreeNodes($treeNodes);
关键注意事项
- 如果你的表中
id是自增字段,需删除SQL中的id插入逻辑,让数据库自动生成ID;或调整表结构允许手动指定ID - 若要更新已有数据,需先清理旧数据(如
TRUNCATE TABLE)或添加更新逻辑避免重复插入 - 确保JSON数据中的
id与数据库表的id字段类型匹配(比如都是int类型)
学习资源参考
- 邻接表模型是最基础的树形数据存储方案,搜索PHP 邻接表 树形数据可找到更多实践案例
- 若需高效查询整棵树、移动节点等操作,可进一步了解嵌套集模型或闭包表模型,但邻接表足够应对你的入门场景
内容的提问来源于stack exchange,提问作者Eren
相关产品推荐
相关产品推荐

