68 lines
1.8 KiB
PHP
68 lines
1.8 KiB
PHP
<?php
|
|
|
|
namespace App\Repository;
|
|
|
|
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
|
|
{
|
|
public function __construct(ManagerRegistry $registry)
|
|
{
|
|
parent::__construct($registry, Article::class);
|
|
}
|
|
|
|
/**
|
|
* @param array<string, mixed> $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;
|
|
}
|
|
}
|