ColdFusion-ORM: Collections
In this post, I will digress a bit and introduce you to a lighter feature of ColdFusion-ORM – COLLECTIONS.
What are collections?
Consider the same tables we have been using – Art and Artists. Say, in the Artist object, you just need an array/struct of Art names instead of an array/struct of the Art objects, then use collections.
Task:
Example to demonstrate collections in ColdFusion-ORM
Previous Related Posts:
Getting Started with ORM
ColdFusion-ORM: Using CRUD Functions
ColdFusion-ORM: Define One-to-Many and Many-to-one relationships
Stuff that you would learn:
- how to create a collection as an array
- how to create a collection as a struct
- how to create a sorted collection
Steps to Run the example:
- This example needs the cfartgallery datasource. This is shipped with ColdFusion by default.
- Create a directory say "ormcollections" under webroot.
- Create the following files – Application.cfc, Artists.cfc and index.cfm.
- Run the URL http://localhost:8500/ormcollections/index.cfm
In this example, I have put comments only in Artsists.cfc. Please read the previous posts if need information about the other files.
Application.cfc
component
{
//Name for the application
this.name = "ORM_Collections";
//ormenabled should be set to true so that ORM is enabled for this application
this.ormenabled = "true";
/*
Set the datasource that needs to be used by the ORM Functions.
You can also set this in the ormsettings struct
*/
this.datasource = "cfartgallery";
}
Artists.cfc
component persistent="true"
{
property name="artistid" generator="increment";
property name="firstname";
property name="lastname";
property name="address";
property name="city";
property name="state";
property name="postalcode";
property name="email";
property name="phone";
property name="fax";
property name="thepassword";
/*
Artists have many arts. Using Collections, the name of the arts created by
each artist can be retrieved as a string array. Note that the art names
is picked from the table and you don’t require the ART component. This also means
that you get an array of strings and not an array of persistent objects.
For doing this, first of all, set fieldtype="collection".
type: can be "array" or "struct". Defaults to array. If type=array, the art
names are retrieved as an array of names. If type=struct, the art names are
retrieved as key-value pairs.
table: The name of the table in which the collection needs to be retrieved from.
fkcolumn: The name of the foriegn key. If not specified, will be figured
out by inspecting the database.
elementcolumn: The name of the table column which should be the retrieved as
the values of the array/struct. In this case, the names of the arts (Art->artname).
elementtype: The datatype of the table column used in elementcolumn.
orderby: Specify the sort order. The string should be specified in the format
"<column_name_1> <sort_order>, <column_name_2> <sort_order>, ...". <column_name>
should be the name of the column name of the table. <sort_order> is "desc" or "asc".
*/
property name="ArtNamesAsArray" fieldtype="collection" table="Art"
fkcolumn="artistid" type="array" elementtype="string" elementcolumn="artname"
orderby="artname desc";
/*
Here is one more property which retrieves artnames but it retrieves it as a struct.
Two additional attributes are requried to defined for this collection type - structkeycolumn and
structkeytype in addition to the attributes used for fieldtype="collection" for type="array".
Structkeycolumn: Specify the column name of the table which should be used for the keys of the struct.
This column should be unique for the records that are retrieved. Here, the column artid is used.
Structkeytype: The type of the column that is used in structkeycolumn.
*/
property name="ArtNamesAsStruct" fieldtype="collection" table="Art" fkcolumn="artistid"
type="struct" elementtype="string" elementcolumn="artname" structkeytype="int"
structkeycolumn="artid" orderby="artid";
}
index.cfm
<!---
This example will teach you Collections.
- how to create a collection as an array
- how to create a collection as a struct
- how to create a sorted collection
cfartgallery datasource is used for this application.
Artists table is one of the table in cfartgallery which contains a list of
artists records. Arts is one other table which contains a list of arts created
by artists. Artists has a one-to-many relationship with Arts records.
Artists and Arts tables are used in this example.
--->
<cfscript>
/*
Load the artists
*/
artists = EntityLoad("Artists");
WriteOutput("<b>Display the Artist name and the name of their arts which we got as an array<br /></b>");
for (i=1;i<=ArrayLen(artists);i++)
{
artist = artists[i];
/*Retrieve the Names of the Arts created by the artist
The Art-Names are retrieved as an array
*/
artNameArray = artist.getArtNamesAsArray();
/*
Display the Artist Name and their arts
*/
WriteOutput("<b>" & artist.getFirstName() & " " & artist.getLastName() & "</b> has created ");
if (ArrayLen(artNameArray))
{
for (j=1;j<=ArrayLen(artNameArray);j++)
{
WriteOutput('<i>' & artNameArray[j] & '</i>, ');
}
}
else
{
WriteOutput("<i>none</i>");
}
WriteOutput("<br>");
}
WriteOutput("<br>");
/*
In the above section, retrieving art names as a array is shown. The following section retrieves the
art names as a struct
*/
WriteOutput("<b>Display the Artist name and his arts which we got as struct<br /></b>");
for (i=1;i<=ArrayLen(artists);i++)
{
artist = artists[i];
/*
Retrieve the names of arts. The Art Names are retrieved as a struct
The keys of the struct are the IDs of the respective arts.
*/
artNameStruct = artist.getArtNamesAsStruct();
/*
Display the Artist Name and their arts.
*/
WriteOutput("<b>" & artist.getFirstName() & " " & artist.getLastName() & "</b> has created ");
artNameKeyArray = StructKeyArray(artNameStruct);
if (ArrayLen(artNameKeyArray))
{
for (j=1;j<=ArrayLen(artNameKeyArray);j++)
{
/*
Art ID is a integer. Hence using the java method to retrieve the value of the struct member
*/
WriteOutput('<i>' & artNameStruct.get(javacast("int", artNameKeyArray[j])) & '</i>, ');
}
}
else
{
WriteOutput("<i>none</i>");
}
WriteOutput("<br>");
}
</cfscript>



Comments
Thank you for sharing this example. If I may be so bold – and tell me to stuff it if you want (grin), I’d recommend against demos that show a ‘view’ (index.cfm) being written in cfscript. Yes, it’s cool we can do so much more in cfscript now, but for display files, I think it gets in the way. Your example code would be far simpler if that index.cfm was tag based (imho). Sorry to be picky.
ORM is complex enough, so whatever else that can be simpler – I’d urge you to do that.
Thanks for the feedback Ray. I am one of those persons who like to code in script syntax and was over-ambitious in this case
. I will use tags for the view code going forward.
Write a Comment