Daniel T.
Daniel T.

Reputation: 38430

How do I sort and filter an in-memory array of ORM objects in ColdFusion?

Let's say I have a Store entity that contains a collection of Products. So I grab my Store and Products like this:

var store = entityLoadByPK("Store", 13);
var products = store.getProducts();

Now I'd like to sort and filter Products, which at this point is an in-memory collection (let's assume that the proxies have been resolved). Is this possible in ColdFusion, and if so, how would I do it?

Side note: I'm basically looking for something similar to C# LINQ's features, where I can do:

var store = session.Query<Store>().Single(x => x.Id == 13);
var products = store.GetProducts();
var sortedProducts = products.OrderBy(x => x.Name).ToList();
var filteredProducts = products.Where(x => x.Name.Contains("Shampoo"));

Upvotes: 3

Views: 962

Answers (3)

Timothy Allyn Drake
Timothy Allyn Drake

Reputation: 926

You may also specify the default comparative and sorting behavior of a relational collection by declaring the "where" and "orderBy" property attributes on the parent entity of a one-to-many or many-to-many relationship. Below is an abbreviated example, followed by a reference to the supporting documentation.

Parent.cfc

component persistent="true"
{
     property cfc="Child" fieldType="one-to-many" name="Children" where="Age >= 18" orderBy="Name ASC, Age DESC"
}

Child.cfc

component persistent="true"
{
     property cfc="Parent" fieldType="many-to-one" name="Parent"
}

Reference

Adobe ColdFusion 9 > ORM > Mapping > Define Relationship

Upvotes: 2

Shannon Hicks
Shannon Hicks

Reputation: 183

There's nothing like what you're hoping for... Boy do I wish there was!

Here's the best I can find for ya: http://cookbooks.adobe.com/post_How_to_sort_an_array_of_objects_or_entities_with_C-17958.html

Upvotes: 0

Dan Short
Dan Short

Reputation: 9616

I think you'll need to use HQL to make that happen. I have a question I posted some time back that had to do with getting items back in a specific order. I ended up creating a custom getProducts method, instead of using the built in getter. That get method then ran the necessary HQL to return the records in the order required.

My question involves a join table in the middle, but the same concepts should apply.

public Products[] function getProducts(string SortColumn = "Name"){
    return EntityLoad("Products", {FKID = getID()}, Arguments.SortColumn & " ASC")
}

In the above case, FKID is the foreign key column in your products table, and getID is the default getter for the PK in your Store object.

I updated the answer to allow you to pass in the sort value as well :). Gotta keep it fancy...

Upvotes: 4

Related Questions