Сортировка детей по значению в Orm

Я знаю, что могу установить определенный атрибут orderby при создании компонентов, и я могу добавить его к методу EntityLoad. Что, если мне нужно каким-то образом отсортировать потомков объекта?

<cfset u = entityLoadByPk('user', 1)>
<cfset p = u.getPages()> <!-- sort by date? -->

Спасибо!


person Manaus    schedule 28.12.2015    source источник


Ответы (1)


Используйте атрибут orderBy в определении свойства отношения:

component name="user" accessors=true persistent=true{

 property name="pages" fieldType="one-to-many" cfc="Page" fkColumn="userID" orderBy="date";

}

РЕДАКТИРОВАТЬ

Приведенное выше установит порядок дочерних объектов по умолчанию. Чтобы разрешить другие варианты упорядочения, вы можете создать метод упорядочения страниц в сущности пользователя, используя OrmExecuteQuery():

array function pagesOrdered( string column="", string direction="ASC" ){
 //use an array to build up the HQL string
 var hql=[ "FROM Page WHERE User.ID = :userID" ];
 //only allow ordering on specified columns
 if( "title,viewcount,updated".ListFindNoCase( arguments.column ) ){
  hql.Append( "ORDER BY " & arguments.column );
 }
 if( arguments.direction IS NOT "ASC" ){
  hql.Append( "DESC" );
 }
 hql=hql.ToList( " " );
 return OrmExecuteQuery( hql, { userID: variables.ID } );
}

Или для немного более лаконичного, но менее ортодоксального подхода попробуйте фильтр гибернации:

array function pagesOrdered( string column="", string direction="ASC" ){
 //use an array to build up the filter
 var filterString=[ "ORDER BY" ];
 //only allow ordering on specified columns
 if( "title,viewcount,updated".ListFindNoCase( arguments.column ) ){
  filterString.Append( arguments.column );
 } else {
  filterString.Append( "dateCreated" );
 }
 if( arguments.direction IS "DESC" ){
  filterString.Append( "DESC" );
 }
 return OrmGetSession().createFilter( variables.pages,filterString.ToList( " " ) ).list();
}
person CfSimplicity    schedule 28.12.2015
comment
Спасибо CfSimplicity, поэтому, если я хочу отсортировать, например, таблицы результатов по имени Asc или Desc, я думаю, единственное решение — прибегнуть к ORMExecuteQuery - person Manaus; 28.12.2015
comment
Вы, безусловно, можете использовать ORMExecuteQuery() для получения упорядоченных результатов. Но твой вопрос о детских отношениях. Вы можете указать ASC или DESC в атрибуте отношения orderBy, например. orderBy="date DESC" - person CfSimplicity; 29.12.2015
comment
Спасибо CfSimplicity, меня интересует, как я могу перевернуть после того, как страница обновит порядок дочерних элементов, когда пользователь нажимает «Изменить порядок» или что-то в этом роде. - person Manaus; 29.12.2015
comment
Хорошо, я не совсем понял это из вашего вопроса. Я обновил свой ответ несколькими предложениями. - person CfSimplicity; 29.12.2015
comment
Извините, в моем обновленном коде были некоторые ошибки со скобками/скобками. - person CfSimplicity; 29.12.2015