Return an empty Collection if there are no posts

Return an empty Collection if there are no related posts for the given
post.

References #3
This commit is contained in:
Oliver Davies 2020-10-07 13:15:12 +01:00
parent 059e237600
commit ae0024f335
2 changed files with 32 additions and 0 deletions

View file

@ -7,6 +7,7 @@ namespace Drupal\opdavies_blog\Repository;
use Drupal\Core\Entity\EntityStorageInterface; use Drupal\Core\Entity\EntityStorageInterface;
use Drupal\Core\Entity\EntityTypeManagerInterface; use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\opdavies_blog\Entity\Node\Post; use Drupal\opdavies_blog\Entity\Node\Post;
use Drupal\taxonomy\TermInterface;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
final class RelatedPostsRepository { final class RelatedPostsRepository {
@ -20,11 +21,23 @@ final class RelatedPostsRepository {
} }
public function getFor(Post $post): Collection { public function getFor(Post $post): Collection {
$tags = $post->get('field_tags')->referencedEntities();
if (!$tags) {
return new Collection();
}
$tagIds = (new Collection($tags))
->map(fn(TermInterface $tag) => $tag->id())
->values();
$query = $this->nodeStorage->getQuery(); $query = $this->nodeStorage->getQuery();
// Ensure that the current node ID is not returned as a related post. // Ensure that the current node ID is not returned as a related post.
$query->condition('nid', $post->id(), '!='); $query->condition('nid', $post->id(), '!=');
$query->condition('field_tags', $tagIds->toArray(), 'IN');
/** @var array $postIds */ /** @var array $postIds */
$postIds = $query->execute(); $postIds = $query->execute();

View file

@ -33,6 +33,25 @@ final class RelatedPostsTest extends PostTestBase {
$this->assertSame('Post B', $relatedPosts->first()->label()); $this->assertSame('Post B', $relatedPosts->first()->label());
} }
/** @test */
public function it_returns_an_empty_collection_if_there_are_no_related_posts(): void {
$postA = $this->postFactory
->setTitle('Drupal 8 post')
->withTags(['Drupal 8'])
->create();
$postA->save();
$postB = $this->postFactory
->setTitle('Drupal 9 post')
->withTags(['Drupal 9'])
->create();
$postB->save();
$relatedPosts = $this->relatedPostsRepository->getFor($postA);
$this->assertEmpty($relatedPosts);
}
protected function setUp() { protected function setUp() {
parent::setUp(); parent::setUp();