在我的Laravel应用程序中,我实现了文章和事件的标记。这可以通过两个表来完成:tags
和taggables
。在我的标签控制器中,我有一个索引方法可以抓取所有标签,标记计数和相同的逻辑来计算使用过的标签。
看起来像这样:
/**
* 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>
这样我就可以从视图中删除一些次要的逻辑。
答案 0 :(得分:1)
使用withCount()
:
$tags = Tag::withCount('articles', 'events')
->orderByRaw('articles_count + events_count DESC')
->get();