我是ColdBox(以及一般的mvc)的新手,并且一直试图自己解决这个问题,但无济于事。一个发现功能在我们的程序网站上工作正常,我试图让我的脚湿透,将它切换到mvc,一点一滴。
在我的mvc测试网站上,我有一个查询,当在我的本地机器上执行时,正确返回预期的元素。但是当它在实时站点上运行时,它会重复第一个元素,但返回的数组中有许多元素。
本地机:ColdBox 4.3,Lucee 4.5.5,MySQL 5.6.37,PHPMyAdmin 4.4.15
直播:ColdBox 4.3,ACF 2016,MySQL 5.7,PHPMyAdmin 4.6.6
这是我的CFC中的功能:
function getMilestonesByDate(required string pickedMonth='', required string pickedDay='') {
transaction {
queryMilestonesByDate = queryExecute("
SELECT tbl_milestones.ID as milestoneID, tbl_milestones.event, tbl_milestones.date
FROM tbl_milestones
WHERE MONTH(tbl_milestones.date) = :pickedMonth AND DAY(tbl_milestones.date) = :pickedDay AND YEAR(tbl_milestones.date) != 1111
ORDER BY tbl_milestones.date ASC
", {
pickedMonth: {value: arguments.pickedMonth, cfsqltype: "cf_sql_varchar"},
pickedDay: {value: arguments.pickedDay, cfsqltype: "cf_sql_varchar"}
}
);
}
milestonesByDate = arrayNew(1);
for (row in queryMilestonesByDate) {
returnStruct = StructNew();
returnStruct["milestoneID"] = queryMilestonesByDate.milestoneID;
returnStruct["event"] = queryMilestonesByDate.event;
returnStruct["date"] = dateFormat(queryMilestonesByDate.date, "full");
arrayAppend(milestonesByDate, returnStruct);
}
return serializeJSON(milestonesByDate);
}
同样,这在本地工作正常。例如,它将显示12月26日的两个不同的里程碑 - 一个在1986年,一个在1995年。但在现场,它将显示1986年里程碑两次。
但是,在实际站点上仅运行PHPMyAdmin中的SQL可以按预期工作:
SELECT tbl_milestones.ID as milestoneID, tbl_milestones.event, tbl_milestones.date
FROM tbl_milestones
WHERE MONTH(tbl_milestones.date) = '12' AND DAY(tbl_milestones.date) = '26' AND YEAR(tbl_milestones.date) != 1111
ORDER BY tbl_milestones.date ASC
所以查询似乎没问题。但有些东西正在被某个地方所淹没,我无法弄明白。如果它有帮助,这是在我的事件处理程序中调用函数:
function showMilestonesByDate( event, rc, prc ) {
prc.milestonesByDate = milestoneModel.getMilestonesByDate(pickedMonth,pickedDay);
event.renderData( type="json", data=prc.milestonesByDate );
}
挑选月份和挑选日期的值来自jQuery UI datepicker。如果有人认为它会有所帮助,我可以发布该代码。但是,只要在测试页面上从硬编码值中转出查询结果,就会显示同样的问题,无论是使用了datepicker还是使用了该页面。
请注意,这一切都在我们的程序网站上运行正常,但我很难将事情转换为mvc,并希望得到任何有关我出错的提示或建议!提前谢谢大家!
更新:这是从本地站点转储prc.milestonesByDate:
[{“date”:“1986年12月26日星期五”,“事件”:“俄罗斯米尔米-34的第一次飞行”,“里程碑ID”:435},{“日期”:“12月26日星期二,1995年,“事件”:“印度海军的第一次飞行HAL Dhruv(Protoype PT4)”,“milestoneID”:428}]
来自现场的同样的事情:
[{“date”:“1986年12月26日星期五”,“milestoneID”:435,“事件”:“俄罗斯米尔-34第一次飞行”},{“日期”:“12月26日星期五,1986“,”milestoneID“:435,”事件“:”俄罗斯米尔米-34的第一次飞行“}}
答案 0 :(得分:4)
此处发生的问题是 ACF 和 Lucee 中查询的for
循环行为略有不同。
我不确定原因。但我观察到的是,Lucee中的for
循环就像<cfloop query="">
一样。但在ACF中并非如此。
在ACF中,您需要在循环中使用变量row
,而不是使用queryMilestonesByDate
。
for (row in queryMilestonesByDate) {
returnStruct = StructNew();
returnStruct["milestoneID"] = queryMilestonesByDate.milestoneID;
returnStruct["event"] = queryMilestonesByDate.event;
returnStruct["date"] = dateFormat(queryMilestonesByDate.date, "full");
arrayAppend(milestonesByDate, returnStruct);
}
因此,为了使循环在ACF和Lucee中都可以工作,您可以将其更改为以下(我认为这是正确的方法,因为您使用的是for (row in queryMilestonesByDate)
)。
for (row in queryMilestonesByDate) {
returnStruct = StructNew();
returnStruct["milestoneID"] = row.milestoneID;
returnStruct["event"] = row.event;
returnStruct["date"] = dateFormat(row.date, "full");
arrayAppend(milestonesByDate, returnStruct);
}
有关其工作原理的示例。
<强> ACF 强>
<强> Lucee 强>