Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
Total | |
0.00% |
0 / 1 |
|
50.00% |
2 / 4 |
CRAP | |
57.14% |
16 / 28 |
PostRepository | |
0.00% |
0 / 1 |
|
50.00% |
2 / 4 |
10.86 | |
57.14% |
16 / 28 |
__construct | |
100.00% |
1 / 1 |
1 | |
100.00% |
2 / 2 |
|||
findLatest | |
0.00% |
0 / 1 |
6 | |
0.00% |
0 / 11 |
|||
findBySearchQuery | |
0.00% |
0 / 1 |
3.01 | |
90.91% |
10 / 11 |
|||
extractSearchTerms | |
100.00% |
1 / 1 |
1 | |
100.00% |
4 / 4 |
<?php | |
/* | |
* This file is part of the Symfony package. | |
* | |
* (c) Fabien Potencier <fabien@symfony.com> | |
* | |
* For the full copyright and license information, please view the LICENSE | |
* file that was distributed with this source code. | |
*/ | |
namespace Smalldb\StateMachine\Test\SymfonyDemo\Repository; | |
use Smalldb\StateMachine\Test\SymfonyDemo\Entity\Post; | |
use Smalldb\StateMachine\Test\SymfonyDemo\Entity\Tag; | |
use Smalldb\StateMachine\Test\SymfonyDemo\Pagination\Paginator; | |
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository; | |
use Doctrine\Common\Persistence\ManagerRegistry; | |
/** | |
* This custom Doctrine repository contains some methods which are useful when | |
* querying for blog post information. | |
* | |
* See https://symfony.com/doc/current/doctrine/repository.html | |
* | |
* @author Ryan Weaver <weaverryan@gmail.com> | |
* @author Javier Eguiluz <javier.eguiluz@gmail.com> | |
* @author Yonel Ceruto <yonelceruto@gmail.com> | |
*/ | |
class PostRepository extends ServiceEntityRepository | |
{ | |
public function __construct(ManagerRegistry $registry) | |
{ | |
parent::__construct($registry, Post::class); | |
} | |
public function findLatest(int $page = 1, Tag $tag = null): Paginator | |
{ | |
$qb = $this->createQueryBuilder('p') | |
->addSelect('a', 't') | |
->innerJoin('p.author', 'a') | |
->leftJoin('p.tags', 't') | |
->where('p.publishedAt <= :now') | |
->orderBy('p.publishedAt', 'DESC') | |
->setParameter('now', new \DateTime()) | |
; | |
if (null !== $tag) { | |
$qb->andWhere(':tag MEMBER OF p.tags') | |
->setParameter('tag', $tag); | |
} | |
return (new Paginator($qb))->paginate($page); | |
} | |
/** | |
* @return Post[] | |
*/ | |
public function findBySearchQuery(string $query, int $limit = Post::NUM_ITEMS): array | |
{ | |
$searchTerms = $this->extractSearchTerms($query); | |
if (0 === \count($searchTerms)) { | |
return []; | |
} | |
$queryBuilder = $this->createQueryBuilder('p'); | |
foreach ($searchTerms as $key => $term) { | |
$queryBuilder | |
->orWhere('p.title LIKE :t_'.$key) | |
->setParameter('t_'.$key, '%'.$term.'%') | |
; | |
} | |
return $queryBuilder | |
->orderBy('p.publishedAt', 'DESC') | |
->setMaxResults($limit) | |
->getQuery() | |
->getResult(); | |
} | |
/** | |
* Transforms the search string into an array of search terms. | |
*/ | |
private function extractSearchTerms(string $searchQuery): array | |
{ | |
$searchQuery = trim(preg_replace('/[[:space:]]+/', ' ', $searchQuery)); | |
$terms = array_unique(explode(' ', $searchQuery)); | |
// ignore the search terms that are too short | |
return array_filter($terms, function ($term) { | |
return 2 <= mb_strlen($term); | |
}); | |
} | |
} |