Silverstripe ORM:按$ belongs_many_many关系的数量排序

时间:2015-10-29 09:58:32

标签: silverstripe

如何在查询中获得最活跃的博客标签?

我有两个DataObjects:

class BlogTag extends DataObject {

//...

    /**
     * @var array
     */
    private static $belongs_many_many = array(
        'BlogPosts' => 'BlogPost',
    );

class BlogPost extends Page {

//...

    /**
     * @var array
     */
    private static $many_many = array(
        'Tags' => 'BlogTag',
    );

现在我想知道如何获得一个DataList,其中所有BlogTags都是根据与他们相关的博客帖子排序的。这就是我已经拥有的,但不知怎的,我不知道如何按BlogPosts.Count()排序:

public function getPopularBlogTags($limit = 5) {
    $tags = BlogTag::get()
        ->sort('BlogPosts.Count()') //doesn't work
        ->limit($limit);

    return $tags;
}

1 个答案:

答案 0 :(得分:5)

在IRC帮助下找到解决方案(感谢barry和mark)

public function getPopularBlogTags($limit = 5) {
    $tags = BlogTag::get()
        ->setQueriedColumns(['ID', 'Title', 'Count(*)'])
        ->leftJoin('BlogPost_Tags','bpt.BlogTagID = BlogTag.ID','bpt')
        ->sort('Count(*) DESC')
        ->alterDataQuery(function($query){
            $query->groupBy('BlogTag.ID');
        })
        ->limit($limit);

    return $tags;
}

在模板中:

   <% loop $PopularBlogTags %>
        <a href="$Link" title="$Title">$Title ($BlogPosts.Count())</a>
        <% if not $Last %> | <% end_if %>
    <% end_loop %>