【问题标题】:Silverstripe ORM: sort by number of $belongs_many_many relationSilverstripe ORM:按 $belongs_many_many 关系的数量排序
【发布时间】:2015-10-29 09:58:32
【问题描述】:

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

我有这两个数据对象:

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',
    );

现在我想知道如何获得一个包含所有 BlogTags 的 DataList,这些 BlogTags 按与它们相关的博客文章的数量排序。这是我已经拥有的,但不知何故我不知道如何按 BlogPosts.Count() 排序:

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

    return $tags;
}

【问题讨论】:

    标签: silverstripe


    【解决方案1】:

    在 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 %>
    

    【讨论】:

    • 这对我很有帮助,谢谢大家!请注意,在我看来,您可以删除 -&gt;setQueriedColumns() 部分,因为在排序子句中包含 COUNT(*) 会导致该列被自动添加。
    • 我认为-&gt;setQueriedColumns() 告诉数据库也只是返回我们当前操作所需的数据,所以它不会返回 all 数据......应该是那么更快..?
    • 你会这么认为,但对我来说似乎不是这样。如果我查看$tags-&gt;sql(),无论有没有-&gt;setQueriedColumns(['ID', 'Title', 'Count(*)']) 部分,结果都完全相同。我不确定该方法的名称是否具有误导性,它实际上只是 adds 查询的列,或者它是否被覆盖。无论如何,我认为在一般情况下尝试限制查询的列并不是最好的选择,因为这意味着您将无法访问模板中的完整对象,并且会产生更紧密的耦合/更少的灵活性。
    • 当然,这取决于每个用例,我也更喜欢取回整个 DataObject。
    猜你喜欢
    • 2017-11-17
    • 1970-01-01
    • 2013-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-16
    • 1970-01-01
    • 2013-04-12
    相关资源
    最近更新 更多