2012-08-15 49 views
2

目前我正在部分工作與cfwheels和它的活動記錄ORM(這是偉大的),並部分原始cfml與其Hibernate的ORM(這也很棒)。CF ORM是否具有活動記錄類型Update()?

這兩種方法都適用於適用的情況,但使用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); 

提前感謝

回答

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

+0

Sergii,完美!這正是我希望找到的那種東西。已經實施..容易!謝謝!!我在看Coldbox Active Record(http://wiki.coldbox.org/wiki/ORM:ActiveEntity.cfm),看起來很酷,但比我要求的要重得多..你的幫手方法是完美的。再次感謝。 – Jason 2012-08-16 04:02:32

+0

@Jason不客氣。我相信這是一個非常流行的想法。我在Transfer ORM和CFWheels ORM中使用了它。不知道爲什麼Hibernate沒有實現它。 – Sergii 2012-08-16 06:48:16

1

有不完全是你想要的一個方法,但EntityNew()確實需要一個可選的結構作爲第二個參數,將設置對象的屬性,雖然這取決於如何你代碼當前有效,但使用這種方法可能會很笨重,我不知道它是否會影響在刷新ORM會話時是否執行創建/更新。

如果你的ORM實體繼承了一個主CFC,那麼你可以在那裏添加一個方法。或者,你可以寫一個作爲函數,並將其混合到你的對象中。如果與unsanitized用戶輸入(如原始FORM範圍)一起使用,那麼update()功能可以是source of security problems(稱爲質量分配問題)。

相關問題