*/ class ArticleRepository extends ServiceEntityRepository { public function __construct(ManagerRegistry $registry) { parent::__construct($registry, Article::class); } /** * @param array $filters */ public function createFilteredQueryBuilder(array $filters): QueryBuilder { $qb = $this->createQueryBuilder('a')->orderBy('a.id', 'DESC'); ContentRepositoryFilter::applyCommon($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; } }