2

目前,我部分使用 cfwheels 及其 Active Record ORM(很棒),部分使用原始 cfml 及其 Hibernate ORM(也很棒)。

两者都适用于适用的情况,但我在使用 CF ORM 时最想念的是 cfwheels 中可用的 model.update() 方法,您只需将表单结构传递给该方法,它就会映射具有模型属性的结构元素并更新记录..非常适合更新和维护大型表。在 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);

提前谢谢了

4

2 回答 2

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);然后保存它。

于 2012-08-15T14:55:47.930 回答
1

没有与您想要的完全一样的方法,但EntityNew()确实将可选结构作为第二个参数,它将设置对象的属性,尽管取决于您的代码当前的工作方式,使用此方法可能很笨拙并且我不知道刷新 ORM 会话时是否执行创建/更新是否会产生任何影响。

如果您的 ORM 实体从主 CFC 继承,那么您可以在其中添加一个方法。或者,您可以将其编写为函数并将其混合到您的对象中。

我相信您知道,但是如果与未经处理的用户输入(例如原始 FORM 范围)一起使用,该 update() 功能可能会成为安全问题(称为批量分配问题)的根源。

于 2012-08-15T10:06:24.377 回答