Как актуально отобразить результаты запроса на кастомный объект?
Всем привет. Есть проект на симфони, сейчас там версия 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 шт):
Желательно почитать про 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.