Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 26 additions & 0 deletions src/Taxonomies/TermRepository.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,11 @@
use Statamic\Contracts\Taxonomies\Term as TermContract;
use Statamic\Facades\Blink;
use Statamic\Facades\Collection;
use Statamic\Facades\Entry;
use Statamic\Facades\Taxonomy;
use Statamic\Stache\Repositories\TermRepository as StacheRepository;
use Statamic\Support\Str;
use Statamic\Taxonomies\LocalizedTerm;

class TermRepository extends StacheRepository
{
Expand Down Expand Up @@ -131,4 +133,28 @@ protected function ensureAssociations()

parent::ensureAssociations();
}

public function entriesCount(TermContract $term, ?string $status = null): int
{
if (config('statamic.eloquent-driver.entries.driver', 'file') !== 'eloquent') {
return parent::entriesCount($term, $status);
}

$query = Entry::query()
->whereTaxonomy($term->taxonomyHandle().'::'.$term->inDefaultLocale()->slug());

if ($term instanceof LocalizedTerm) {
$query->where('site', $term->locale());
}

if ($collection = $term->collection()) {
$query->where('collection', $collection->handle());
}

if ($status) {
$query->whereStatus($status);
}

return $query->count();
}
}
57 changes: 57 additions & 0 deletions tests/Terms/TermTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,63 @@ public function it_gets_entry_count_for_term()
$this->assertEquals(2, TermFacade::entriesCount($term));
}

#[Test]
public function it_gets_entry_count_for_term_filtered_by_status()
{
Taxonomy::make('test')->title('test')->save();

$term = tap(TermFacade::make('test-term')->taxonomy('test')->data([]))->save();

$collection = Collection::make('blog')->routes('blog/{slug}')->taxonomies(['test'])->save();

(new Entry)->id(1)->collection($collection)->data(['title' => 'Post 1', 'test' => ['test-term']])->slug('alfa')->published(true)->save();
(new Entry)->id(2)->collection($collection)->data(['title' => 'Post 2', 'test' => ['test-term']])->slug('bravo')->published(false)->save();
(new Entry)->id(3)->collection($collection)->data(['title' => 'Post 3', 'test' => ['test-term']])->slug('charlie')->published(false)->save();

$this->assertEquals(1, TermFacade::entriesCount($term, 'published'));
$this->assertEquals(2, TermFacade::entriesCount($term, 'draft'));
}

#[Test]
public function it_gets_entry_count_for_term_scoped_to_collection()
{
Taxonomy::make('test')->title('test')->save();

$term = tap(TermFacade::make('test-term')->taxonomy('test')->data([]))->save();

$blog = Collection::make('blog')->routes('blog/{slug}')->taxonomies(['test'])->save();
$news = Collection::make('news')->routes('news/{slug}')->taxonomies(['test'])->save();

(new Entry)->id(1)->collection($blog)->data(['title' => 'Blog 1', 'test' => ['test-term']])->slug('alfa')->save();
(new Entry)->id(2)->collection($blog)->data(['title' => 'Blog 2', 'test' => ['test-term']])->slug('bravo')->save();
(new Entry)->id(3)->collection($news)->data(['title' => 'News 1', 'test' => ['test-term']])->slug('charlie')->save();

$this->assertEquals(2, TermFacade::entriesCount(TermFacade::find('test::test-term')->collection($blog)));
$this->assertEquals(1, TermFacade::entriesCount(TermFacade::find('test::test-term')->collection($news)));
}

#[Test]
public function it_gets_entry_count_for_term_filtered_by_site()
{
$this->setSites([
'en' => ['url' => '/', 'locale' => 'en_US', 'name' => 'English'],
'fr' => ['url' => '/fr/', 'locale' => 'fr_FR', 'name' => 'French'],
]);

Taxonomy::make('test')->title('test')->sites(['en', 'fr'])->save();

$term = tap(TermFacade::make('test-term')->taxonomy('test')->data([]))->save();

$collection = Collection::make('blog')->routes('blog/{slug}')->taxonomies(['test'])->sites(['en', 'fr'])->save();

(new Entry)->id(1)->collection($collection)->locale('en')->data(['title' => 'Post 1', 'test' => ['test-term']])->slug('alfa')->save();
(new Entry)->id(2)->collection($collection)->locale('en')->data(['title' => 'Post 2', 'test' => ['test-term']])->slug('bravo')->save();
(new Entry)->id(3)->collection($collection)->locale('fr')->data(['title' => 'Post 3', 'test' => ['test-term']])->slug('charlie')->save();

$this->assertEquals(2, TermFacade::entriesCount($term->in('en')));
$this->assertEquals(1, TermFacade::entriesCount($term->in('fr')));
}

#[Test]
public function it_build_stache_associations_when_taxonomy_driver_is_not_eloquent()
{
Expand Down
Loading