在 Orm 中按值排序 children
Sorting children by value in Orm
我知道我可以在创建组件时设置特定的 orderby
属性,并且可以将相同的属性添加到 EntityLoad
方法中。如果我必须以某种方式对实体的 children 进行排序怎么办?
<cfset u = entityLoadByPk('user', 1)>
<cfset p = u.getPages()> <!-- sort by date? -->
谢谢!
在关系中使用 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();
}
我知道我可以在创建组件时设置特定的 orderby
属性,并且可以将相同的属性添加到 EntityLoad
方法中。如果我必须以某种方式对实体的 children 进行排序怎么办?
<cfset u = entityLoadByPk('user', 1)>
<cfset p = u.getPages()> <!-- sort by date? -->
谢谢!
在关系中使用 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();
}