Sam Farmer

Growing up I never imagined I would play bass guitar for the Dave Matthews Band. And indeed it never happened.

Using structures/maps instead of arrays in ORM

May 26, 2011

By default an ORM relationship is an array. Using a structure (map for non-ColdFusion programmers) is very easy and provides nice options. Lets start with a simple relationship between of users and addresses.


User.cfc component persistent="true" { property name="userId" fieldtype="id" generated="always" generator="native"; property name="name" ormtype="string"; property name="address" fieldtype="one-to-many" cfc="address" fkcolumn="userId" inverse="true"; }


Address.cfc component persistent="true" { property name="addressId" fieldtype="id" generated="always" generator="native"; property name="type" ormtype="string"; property name="street" ormtype="string"; property name="city" ormtype="string"; property name="state" ormtype="string"; property name="user" fieldtype="many-to-one" cfc="user"; }


A single user object with two addresses would look like this:

Now, if we want to find out if the user has a work address we need to loop through getAddress(). Thats ok but by converting the relationship to a struct its possible to then use structure functions. Here is the relationship in User.cfc defined to return a structure: property name="address" fieldtype="one-to-many" cfc="address" fkcolumn="userId" inverse="true" type="struct" structkeycolumn="type";


A dump of the user object now looks like:


Which means we can use code like this: <cfdump var="#user.getAddress()["work"]#">


For reference here is the Application.cfc to set up Hibernate/ORM:
component { this.name="structsDemo"; this.ormEnabled=true; this.datasource="cfartgallery"; this.ormsettings = { dbcreate="update" }; }

4 Comments

Hey Sam, That's an excellent post thanks. I often forget that you can use structs for relationships, probably because I never really put much thought into the possible use cases for it. This makes really great sense, and is an excellent approach. Thanks, Robert

By: Robert Rawlins 05/27/2011 3:29 AM
One more thought: Reading this does reawaken my desire for more intelligent collections in ORM entities other than just static arrays and structs. Something which makes searching and filtering the collection much simpler. cfwheels has a great implementation, similar to that of Rails, where in your use case I wouldn't have to care about what collection we use (array vs. struct), nor would I have to run the structKeyExists(), I could search/filter the collection like so: User.Address.findWhere(type='work'); I would love to see enhancements in the cf-orm implementation to do something like this. Robert

By: Robert Rawlins 05/27/2011 3:34 AM
@Robert Thanks. The wheels/rails example is cool. In your example does that return just users who have a work address? And for those does it return there other addresses as well? I think you can do something like this with HQL / ORMExecuteQuery()

By: Sam Farmer 05/27/2011 8:20 AM
Some comments have been lost over the years due to moving hosts.

More


More blog entries that I have written.

Code coloring by PRISM.