FullCalendar加载JSON事件时MySQL使用constraint保留字致查询报错
constraint 是 MySQL 内置保留关键字,直接将其作为SELECT语句的字段别名且未做转义时,会触发SQL语法错误,导致接口返回异常,FullCalendar无法获取到事件数据,自然无法正常渲染。
以下三种方案均可实现需求,按需选择即可:
方案1:转义SQL保留字别名(改动最小)
无需调整前后端其他逻辑,仅需给作为别名的constraint加上MySQL标识符转义反引号,即可让SQL正常执行,修改后SQL对应片段如下:bh_constraint AS `constraint` FROM bookings修改后接口输出的JSON会直接携带
constraint字段,FullCalendar可自动识别并应用营业时间约束,和你本地硬编码事件列表的效果完全一致。
注意:转义必须使用反引号(`),不能用单引号或双引号,否则会被识别为字符串常量而非字段别名。方案2:通过前端回调注入约束属性(无需改后端)
如果不想调整SQL语句,可以在FullCalendar初始化配置中添加eventDataTransform回调,在事件数据加载完成、正式渲染前,给符合条件的事件手动加上constraint属性,配置示例:events: { url: '../json_feed_bookings/json_feed_bookings.php', method: 'POST', extraParams: function(){ return {param1: view2}; } }, eventDataTransform: function(event) { // 按自身业务规则匹配需要约束的事件,示例为按booking_type判断 if (event.booking_type == 1) { event.constraint = 'businessHours'; } return event; }该方案将约束规则全部放在前端维护,后续调整规则不需要改动后端代码。
方案3:自定义字段名+前端映射(彻底规避保留字问题)
可以在SQL中给字段起一个非保留字的别名(比如eventConstraint),避开语法错误,再通过前端回调把字段映射为FullCalendar识别的constraint属性。
SQL对应片段修改为:bh_constraint AS eventConstraint FROM bookings前端映射逻辑:
eventDataTransform: function(event) { if (event.eventConstraint) { event.constraint = event.eventConstraint; delete event.eventConstraint; } return event; }该方案彻底避开了SQL保留字冲突,适合后续需要扩展更多自定义事件属性的场景。
内容的提问来源于stack exchange,提问作者JB-chrysalisbsl

