我正在使用Model-Glue / Coldspring进行新的应用程序,我想我会把CF9 ORM投入到混合中。
我现在唯一的问题是使用对象填充实体。或多或少以下代码验证只能存在一个用户名。还有一些其他逻辑没有显示出来。
我的第一个想法是使用这样的东西:
var entity = entityload('UserAccount' ,{UserName=arguments.UserAccount.getUserName()},"true")
entity = arguments.UserAccount;
然而,这不符合我的预期。甚至可以使用对象填充实体,还是需要使用setter?
答案 0 :(得分:4)
不确定这是否是您要找的。如果你有......
component persistent="true" entityName="Foo"
{
property a;
property b;
}
你可以在第二个参数中传递一个结构来初始化实体(我相信在CF9.0.1中添加)
EntityNew("Foo", {a="1",b="2"});
要用另一个对象填充Foo,您可以使用Memento模式,并为您的对象实现一个GetMemento()
函数,该函数返回其所有属性的结构。
EntityNew("Foo", bar.getMemento());
但是,CF不会打电话给您的自定义设置器!如果要使用setter设置它们,可以在init()
构造函数中添加对setter的调用,或者使用您选择的MVC框架来填充bean。在Model-Glue中,它是makeEventBean()
。
更新:或者......这是黑客......
EntityNew("Foo", DeserializeJSON(SerializeJSON(valueObject)));
使用此风险需要您自担风险。 JSON可能对你的数字以及'yes','no','true','false'字符串做了奇怪的事情。 :)
答案 1 :(得分:0)
甚至可以使用对象填充实体,还是需要使用setter?
如果您的意思是“是否有可能创建从已存在且已设置属性的持久性CFC的实例加载ORM实体”,那么您可以使用EntityLoadByExample( object,[unique] )
entity = EntityLoadByExample( arguments.userAccount,true );
这假设userAccount CFC已被定义为持久性,并且在传入之前已设置其用户名值(在您的情况下似乎就是这种情况)。
请记住,如果在您传递的对象中设置了任何其他属性,包括空字符串,它们将用作加载实体的过滤器,因此如果它们与数据库中的记录不完全匹配,则不执行任何操作将被加载。