在Laravel中按计数排序

时间:2018-06-13 15:57:03

标签: php laravel laravel-5

在我的Laravel应用程序中,我实现了文章和事件的标记。这可以通过两个表来完成:tagstaggables。在我的标签控制器中,我有一个索引方法可以抓取所有标签,标记计数和相同的逻辑来计算使用过的标签。

看起来像这样:

/**
 * Display a listing of the resource.
 *
 * @return \Illuminate\Http\Response
 */
public function index()
{
    $tags = Tag::orderByDesc('name')->get();    
    $tagCount = count($tags);
    $usedTags = Tag::has('articles')->orHas('events')->orderBy('name')->get();
    $usedTagsCount = count($usedTags);

    return view('pages.tags.index', compact('tags', 'usedTags', 'tagCount', 'usedTagsCount'));
}

我将所有这些数据传递给我的视图,如下所示:

<div class="container">
    <div class="row">

        <!-- Search results -->
        <div class="col-md-8">
            <div class="padded-content-box">
                <div class="header">
                    <div class="row">
                        <div class="col-xs-12 col-md-12">
                            <h1 class="heading">Tags</h1>
                        </div>
                    </div>
                </div>
            </div>

            <div class="padded-content-box">
                    <div class="header">
                        <div class="row">
                            <div class="col-xs-12 col-md-12">
                                <h2 class="sub-heading">
                                    All Tags ({{ $tagCount }})
                                </h2>
                            </div>
                        </div>
                    </div>

                    <div class="content">
                        <div class="tag-row">
                            <div class="tag-words-list">
                                @foreach($tags as $tag)
                                    <a class="tag-word" title="{{ $tag->name }}" href="{{ URL::action('TagController@show', $tag->slug) }}">{{ $tag->name }}</a>
                                @endforeach
                            </div>
                        </div>
                    </div>
                </div>

            <div class="padded-content-box">
                    <div class="header">
                        <div class="row">
                            <div class="col-xs-12 col-md-12">
                                <h2 class="sub-heading">
                                    Tags currently in use ({{ $usedTagsCount }})
                                </h2>
                            </div>
                        </div>
                    </div>

                    <div class="content">
                        @foreach($usedTags as $tag)
                        <p>
                            <a class="tag-word" title="{{ $tag->name }}" href="{{ URL::action('TagController@show', $tag->slug) }}">{{ $tag->name }}</a> 
                            x {{  count($tag->articles) + count($tag->events) }}
                        </p>
                        @endforeach
                    </div>
                </div>
        </div>

        <div class="col-md-4"></div>
    </div>
</div>

如您所见,为了显示所用标签的数量,我只需添加具有给定标签的文章和事件。

我如何计算每个标签在事件和文章中的使用次数,然后按计数排序。基本上如果标签已被使用最多,它将位于列表的顶部。

更新

如我所知,我已将控制器方法更改为:

public function index()
{
    $tags = Tag::orderBy('name')->get();

    $tagCount = count($tags);

    $usedTags = Tag::has('articles')->orHas('events')->withCount('articles', 'events')->orderByRaw('articles_count + events_count DESC')->orderBy('name')->get();

    $usedTagsCount = count($usedTags);

    return view('pages.tags.index', compact('tags', 'usedTags', 'tagCount', 'usedTagsCount'));
}

这可以确保标签按计数和字母顺序排列。

然后在我看来,我将计数代码更改为:

<p>
    <a class="tag-word" title="{{ $tag->name }}" href="{{ URL::action('TagController@show', $tag->slug) }}">{{ $tag->name }}</a> x {{  $tag->articles_count + $tag->events_count }} 
</p>

这样我就可以从视图中删除一些次要的逻辑。

1 个答案:

答案 0 :(得分:1)

使用withCount()

$tags = Tag::withCount('articles', 'events')
    ->orderByRaw('articles_count + events_count DESC')
    ->get();