issues/27: prod baseline without task branch

This commit is contained in:
Valery Petrov
2026-05-28 19:54:31 +03:00
parent f8f03fe849
commit 8579fe3472
31 changed files with 1468 additions and 986 deletions
+43 -18
View File
@@ -2,10 +2,8 @@
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;
/**
@@ -13,34 +11,63 @@ use Doctrine\Persistence\ManagerRegistry;
*/
class ArticleRepository extends ServiceEntityRepository
{
use ContentFilterTrait;
public function __construct(ManagerRegistry $registry)
{
parent::__construct($registry, Article::class);
}
/**
*/
public function createFilteredQueryBuilder(ContentFilterDto $filters): QueryBuilder
public function findByFilters(array $filters, int $page = 1, int $limit = 20): array
{
$qb = $this->createQueryBuilder('a')->orderBy('a.id', 'DESC');
$qb = $this->createQueryBuilder('a');
$this->applyCommonFilters($qb, 'a', $filters);
if (isset($filters['alias']) && $filters['alias'] !== '') {
$qb->andWhere('a.alias = :alias')
->setParameter('alias', $filters['alias']);
}
if (isset($filters['active']) && $filters['active'] !== '') {
$qb->andWhere('a.active = :active')
->setParameter('active', filter_var($filters['active'], FILTER_VALIDATE_BOOLEAN));
}
if (isset($filters['regionId']) && $filters['regionId'] !== '') {
$qb->andWhere('a.regionId = :regionId')
->setParameter('regionId', (int) $filters['regionId']);
}
return $qb;
$qb->orderBy('a.id', 'DESC');
$qb->setFirstResult(($page - 1) * $limit)
->setMaxResults($limit);
return $qb->getQuery()->getResult();
}
public function countByFilters(array $filters): int
{
$qb = $this->createQueryBuilder('a')
->select('COUNT(a.id)');
if (isset($filters['alias']) && $filters['alias'] !== '') {
$qb->andWhere('a.alias = :alias')
->setParameter('alias', $filters['alias']);
}
if (isset($filters['active']) && $filters['active'] !== '') {
$qb->andWhere('a.active = :active')
->setParameter('active', filter_var($filters['active'], FILTER_VALIDATE_BOOLEAN));
}
if (isset($filters['regionId']) && $filters['regionId'] !== '') {
$qb->andWhere('a.regionId = :regionId')
->setParameter('regionId', (int) $filters['regionId']);
}
return (int) $qb->getQuery()->getSingleScalarResult();
}
/**
* Поиск статьи по alias с учётом возможных вариантов написания (исторический функционал).
*/
public function findOneByAlias(string $alias): ?Article
{
$alias = trim($alias);
if ($alias === '') {
return null;
}
$variants = [
$alias,
$alias . '-',
@@ -52,18 +79,16 @@ class ArticleRepository extends ServiceEntityRepository
return $article;
}
}
// Фолбэк по TRIM(alias) в БД для совместимости со старыми данными.
// Поиск по TRIM(alias) в БД (нативный SQL для совместимости с PostgreSQL)
$conn = $this->getEntityManager()->getConnection();
$id = $conn->fetchOne(
'SELECT id FROM article WHERE TRIM(alias) = :alias LIMIT 1',
['alias' => $alias],
['alias' => \PDO::PARAM_STR],
['alias' => \PDO::PARAM_STR]
);
if ($id !== false) {
return $this->find($id);
}
return null;
}
}