如何在未指定ParentID时自动设为ID值?Vue+Knex+MySQL留言板开发
解决方案
一、自动设置parent_id为自身id(未指定时)
有两种实现方式,可根据开发习惯选择:
1. Knex代码层面处理
先插入不带parent_id的记录,获取插入后的自增id,再更新该记录的parent_id为自身id:
// 插入新父消息(不传入parent_id) knex('messages') .insert({ board: 1, date: '7-14-2022', user: 'new_user', subject: 'new parent message', message: 'message content' }) .then(insertedIds => { const newId = insertedIds[0]; // 更新parent_id为自身id return knex('messages') .where('id', newId) .update({ parent_id: newId }); }) .catch(err => console.error('操作失败:', err));
2. MySQL触发器自动处理
在数据库层面创建触发器,插入时若parent_id未指定(为NULL),自动将其设为即将生成的自增id:
DELIMITER // CREATE TRIGGER set_parent_id_on_insert BEFORE INSERT ON messages FOR EACH ROW BEGIN IF NEW.parent_id IS NULL THEN SET NEW.parent_id = (SELECT AUTO_INCREMENT FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'messages'); END IF; END // DELIMITER ;
注:该方式依赖
information_schema获取下一个自增ID,高并发场景下建议测试验证,也可改用AFTER INSERT触发器更新记录。
二、筛选指定board并按要求排序
使用Knex的where和orderBy方法,先按parent_id分组,再按id排序,确保父消息和对应回复排在一起:
// 筛选board=1的消息,按parent_id升序、id升序排列 knex('messages') .where('board', 1) .orderBy('parent_id', 'asc') .orderBy('id', 'asc') .then(messages => { // 处理返回的消息列表:父消息在前,对应回复紧随其后 console.log(messages); }) .catch(err => console.error('查询失败:', err));
排序逻辑说明:父消息的parent_id等于自身id,回复的parent_id等于父消息的id,因此按parent_id排序会将同一组的父消息和回复归为一类,再按id排序可保证父消息(id最小)排在组内最前面。
内容的提问来源于stack exchange,提问作者Marcus Mann
相关产品推荐
相关产品推荐

