目前我正在使用cfwheels及其Active Record ORM(非常棒),部分原始cfml及其Hibernate ORM(也很棒)。
两者都适用于适用的情况,但在使用CF ORM时我最想念的是cfwheels中提供的model.update()方法,您可以将表单结构传递给方法,它将会使用模型属性映射struct元素并更新记录..非常适合更新和维护大表。在CF ORM中,似乎更新记录的唯一方法是单独设置每个列,然后进行保存。是这种情况吗?
cf9 ORM是否有一个Active Record类型的update()(或等效)方法,它只能接收一个带有值的结构来更新和更新对象,而不必指定每一个?
例如,而不是当前:
member = entityLoadByPK('member',arguments.id);
member.setName(arguments.name);
member.setEmail(arguments.email);
有没有办法在CF ORM中做这样的事情?
member = entityLoadByPK('member',arguments.id);
member.update(arguments);
非常感谢提前
答案 0 :(得分:1)
没有一种方法与你想要的方法完全相同,但EntityNew()确实将可选结构作为第二个参数,它将设置对象的属性,尽管取决于代码当前的工作方式,它可能很笨重使用这种方法,我不知道在刷新ORM会话时是否对执行创建/更新有任何影响。
如果您的ORM实体从主CFC继承,那么您可以在那里添加方法。或者,您可以将一个作为函数编写并将其混合到您的对象中。
我确定您知道,但如果与未经过验证的用户输入(例如原始FORM范围)一起使用,则update()功能可以是source of security problems(称为质量分配问题)。< / p>
答案 1 :(得分:1)
在我的应用程序中,我通常为处理任务的模型创建两个辅助函数:
/*
* Get properties as key-value structure
* @limit Limit output to listed properties
*/
public struct function getMemento(string limit = "") {
local.props = {};
for (local.key in variables) {
if (isSimpleValue(variables[local.key]) AND (arguments.limit EQ "" OR ListFind(arguments.limit, local.key))) {
local.props[local.key] = variables[local.key];
}
}
return local.props;
}
/*
* Populate the model with given properties collection
* @props Properties collection
*/
public void function setMemento(required struct props) {
for (local.key in arguments.props) {
variables[local.key] = arguments.props[local.key];
}
}
为了更好地保护setMemento
,可以在变量范围内检查local.key
是否存在,但这将跳过可空属性。
所以你可以制作myObject.setMemento(dataAsStruct);
然后保存它。