chore: initial import for test contour
This commit is contained in:
@@ -0,0 +1,69 @@
|
||||
<?php
|
||||
|
||||
namespace App\Repository;
|
||||
|
||||
use App\Dto\Content\ContentFilterDto;
|
||||
use App\Entity\Article;
|
||||
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
|
||||
use Doctrine\ORM\QueryBuilder;
|
||||
use Doctrine\Persistence\ManagerRegistry;
|
||||
|
||||
/**
|
||||
* @extends ServiceEntityRepository<Article>
|
||||
*/
|
||||
class ArticleRepository extends ServiceEntityRepository
|
||||
{
|
||||
use ContentFilterTrait;
|
||||
|
||||
public function __construct(ManagerRegistry $registry)
|
||||
{
|
||||
parent::__construct($registry, Article::class);
|
||||
}
|
||||
|
||||
/**
|
||||
*/
|
||||
public function createFilteredQueryBuilder(ContentFilterDto $filters): QueryBuilder
|
||||
{
|
||||
$qb = $this->createQueryBuilder('a')->orderBy('a.id', 'DESC');
|
||||
|
||||
$this->applyCommonFilters($qb, 'a', $filters);
|
||||
|
||||
return $qb;
|
||||
}
|
||||
|
||||
/**
|
||||
* Поиск статьи по alias с учётом возможных вариантов написания (исторический функционал).
|
||||
*/
|
||||
public function findOneByAlias(string $alias): ?Article
|
||||
{
|
||||
$alias = trim($alias);
|
||||
if ($alias === '') {
|
||||
return null;
|
||||
}
|
||||
|
||||
$variants = [
|
||||
$alias,
|
||||
$alias . '-',
|
||||
'/' . ltrim($alias, '/'),
|
||||
];
|
||||
foreach ($variants as $v) {
|
||||
$article = $this->findOneBy(['alias' => $v]);
|
||||
if ($article !== null) {
|
||||
return $article;
|
||||
}
|
||||
}
|
||||
|
||||
// Фолбэк по TRIM(alias) в БД для совместимости со старыми данными.
|
||||
$conn = $this->getEntityManager()->getConnection();
|
||||
$id = $conn->fetchOne(
|
||||
'SELECT id FROM article WHERE TRIM(alias) = :alias LIMIT 1',
|
||||
['alias' => $alias],
|
||||
['alias' => \PDO::PARAM_STR],
|
||||
);
|
||||
if ($id !== false) {
|
||||
return $this->find($id);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user