Как актуально отобразить результаты запроса на кастомный объект?

Всем привет. Есть проект на симфони, сейчас там версия Symfony 5.2. Открыл проект в PHPStorm и обратил внимание, что в методах, где идёт запрос в БД и отображение результата на объект, методы setFetchMode и fetch объявлены как Deprecated. Константа FetchMode::CUSTOM_OBJECT также объявлена устаревшей. Как лучше всего переписать код в современных реалиях?

$stmt = $this->connection->createQueryBuilder()
    ->select(
        'id',
        'fname',
        'lname'
    )
    ->from('user_users')
    ->andWhere('email = :email')
    ->setParameter(':email', $email)
    ->execute();

$stmt->setFetchMode(FetchMode::CUSTOM_OBJECT, AuthView::class);
$result = $stmt->fetch();
return $result ?: null;

Ответы (1 шт):

Автор решения: Borislav

Желательно почитать про repository в symfony documentation.

Я бы посоветовал создать AuthViewRepository, который привязан к AuthView. В свою очередь, сущность (entity) AuthView будет содержать в себе сущность User как вложенную (embedded), доктрина это умеет.

Таким образом у вас запрос будет выглядеть примерно так:

class UserRepository 
{
    public function __construct(ManagerRegistry $registry) 
    {
        parent::__construct($registry, AuthView::class);
    }
    
    public function findUserByEmail(string $email): User|null
    {
        return $this->findOneBy(['email' => $email])?->getUser();
    }    
}

UserRepository - это ввиртуальный репозиторий, который оперирует сущностью AuthView для получения User. В таком случае да, есть некая избыточность данных, тем более, если AuthView сущность очень широкая, однако, вы можете дописать ->select('v.user') или же аналогично поиграаться с fetch_mode.

→ Ссылка