не может получить объект результата в доктрине

110
15

Я получил DQL:

$sql =$qb->select('login,id')
->from('Cusomter','c')
->where('c.login = :login')
->setParameter('login',$login);
$rs = $sql->getQuery()->getResult();

Я хочу, чтобы результат возвращался как объект с двумя свойствами: Login, id. В любом случае я могу это сделать? Я попробовал CustomHydrator но это не сработает. это мой CustomHydrator:

namespace Hydrator;

use Doctrine\ORM\Internal\Hydration\AbstractHydrator;

class CustomHydrator extends AbstractHydrator
{
protected function hydrateAllData()
{
return $this->_stmt->fetchAll(\PDO::FETCH_ASSOC);
}
}

Затем я добавил $em->getConfiguration()->addCustomHydrationMode('CustomHydrator', 'Hydrator\CustomHydrator');
и запустить: $rs = $sql->getQuery()->getResult('CustomHydrator');

спросил(а) 2021-01-19T20:14:45+03:00 6 месяцев, 1 неделя назад
1
Решение
90

Есть несколько способов сделать это. Если это запрос, который вам нужно повторно использовать, то, возможно, лучший подход - это устные гидраторы Doctrine. Если нет, вы можете просто передать результат объекту.

Если вам нужен один результат:

$sql =$qb->select('c.login, c.id')
->from('Cusomter','c')
->where('c.login = :login')
->setParameter('login', $login);
$rs = (object) $sql->getQuery()->getSingleResult();

Если вам нужно вернуть массив объектов (т.е. Несколько элементов результата), вы можете просто привести каждый результат:

$sql =$qb->select('c.login, c.id')
->from('Cusomter','c')
->where('c.login = :login')
->setParameter('login', $login);

$rs_new = array_map(function ($value) {
return (object) $value;
}, $sql->getQuery()->getResult());

ответил(а) 2021-01-19T20:14:45+03:00 6 месяцев, 1 неделя назад
45

Лучший способ использования Entity в качестве результата http://symfony.com/doc/current/doctrine.html#creating-an-entity-class

Насколько я понимаю, вам нужен только один результат, поэтому используйте следующий код внутри репозитория:

$ rs = $this-> findOneBy (['login' => $ login]);

ответил(а) 2021-01-19T20:14:45+03:00 6 месяцев, 1 неделя назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема