<?php
/**
* Created by simpson <simpsonwork@gmail.com>
* Date: 2019-03-19
* Time: 23:05
*/
namespace App\Repository;
use App\Entity\Location\City;
use App\Repository\ReadModel\CityReadModel;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Persistence\ManagerRegistry;
class CityRepository extends ServiceEntityRepository
{
use EntityIteratorTrait;
public function __construct(ManagerRegistry $registry)
{
parent::__construct($registry, City::class);
}
public function ofUriIdentity(string $uriIdentity): ?City
{
$qb = $this->createQueryBuilder('city')
->andWhere('city.uriIdentity = :uri')
->setParameter('uri', $uriIdentity)
->setMaxResults(1)
;
$query = $qb->getQuery()
->useResultCache(true)
->setResultCacheLifetime(3600)
;
return $query->getOneOrNullResult();
}
public function ofName(string $name, string $locale = 'ru'): ?City
{
$qb = $this->createQueryBuilder('city')
->andWhere('JSON_EXTRACT(city.name, :json_path) = :name')
->setParameter('json_path', '$.'.$locale)
->setParameter('name', $name)
->setMaxResults(1)
;
$query = $qb->getQuery();
return $query->getOneOrNullResult();
}
public function cityCountries(): array
{
$qb = $this->createQueryBuilder('city')
->distinct(true)
->select('city.countryCode')
;
$query = $qb->getQuery()
->useResultCache(true)
->setResultCacheLifetime(3600)
;
$result = $query->getScalarResult();
return array_column($result, 'countryCode');
}
public function getAll(): array
{
$qb = $this->createQueryBuilder('city')
->select('city.id, city.name, city.uriIdentity, city.countryCode')
;
$result = array_map(function($profile): CityReadModel {
return $this->hydrateCityRow($profile);
}, $qb->getQuery()->getResult());
return $result;
}
private function hydrateCityRow(array $row): CityReadModel
{
$view = new CityReadModel();
$view->id = $row['id'];
$view->name = $row['name'];
$view->uriIdentity = $row['uriIdentity'];
$view->countryCode = $row['countryCode'];
return $view;
}
}