Доктрина 2: результат запроса как ассоциативный массив
В моем классе Repository я использую следующий код для запроса:
$query = $this->getEntityManager()->createQuery("
SELECT s.term, COUNT(s.term) AS freq
FROM App\Entities\SearchTerm s
GROUP BY s.term
ORDER BY s.term ASC
");
$result = $query->getResult();
В результате я получаю что-то вроде:
array (size=4)
0 =>
array (size=2)
'term' => string '' (length=0)
'freq' => string '1' (length=1)
1 =>
array (size=2)
'term' => string 'foo' (length=3)
'freq' => string '1' (length=1)
2 =>
array (size=2)
'term' => string 'bar' (length=3)
'freq' => string '2' (length=1)
3 =>
array (size=2)
'term' => string 'baz' (length=3)
'freq' => string '2' (length=1)
Но я предпочел бы иметь ассоциативный массив:
array (size=4)
'' => string '1' (length=1)
'foo' => string '1' (length=1)
'bar' => string '2' (length=1)
'baz' => string '2' (length=1)
Возможно ли это без дополнительного цикла for для создания нужного массива?
Ответы
Ответ 1
Я знаю его старый, но сегодня мне пришлось делать почти то же самое, мое решение без специального гидратора
- INDEX BY s.term
- Для корректной настройки getResult() убедитесь, что
как
$result = $query->getQuery()->getResult(\Doctrine\ORM\AbstractQuery::HYDRATE_ARRAY);
или
$result = $query->getQuery()->getResult(2);
- отформатировать результат
а
$resultNeeded = array_map(function($value) { return $value['freq']; }, $result);
Ответ 2
Если вам нужен массив, вы можете использовать метод getArrayResult
.
Получает массив результатов для запроса.
Псевдоним для выполнения (ноль, HYDRATE_ARRAY).
$result = $query->getQuery()->getArrayResult();
Таким образом, использование этого метода даст вам тот же результат, что и использование константы HYDRATE_ARRAY
.
Ответ 3
На самом деле где-то перестановка должна быть выполнена. См. 14.7.4. Режимы гидратации о том, что возвращается ->getResult()
и какие альтернативные режимы/варианты уже существуют.
Вы также можете добавить свой собственный режим гидратации в центральном месте. Это объясняется в 14.7.4.5. Пользовательские режимы гидратации.
Ответ 4
После многих поисков я нашел несколько решений для объекта доктрины для преобразования массива. Когда мы имеем связанные объекты в результате.
1.
$person = $em->find('Person', 2);
$da = array();
$person = (array) $person;
foreach($person as $i=>$d) {
if (is_object($d)) {
$d = (array) $d;
foreach($d as $si=>$sd){
if (is_object($sd)) {
//var_dump('after convert array');
$da[$i][$si] = (array) $sd ;
//var_dump($da[$i][$si]);
} else {
$da[$i][$si] = $sd ;
//var_dump($da[$i][$si] );
}
}
} else {
$da[$i] = $d;
//var_dump($da[$i]);
}
}
echo '<pre>'; print_r($da); echo '<pre>'; exit;
2.
$query = $em->createQuery('SELECT w FROM Person w WHERE w.Id = 2');
$person = $query->getResult(\Doctrine\ORM\Query::HYDRATE_ARRAY);
echo '<pre>'; \Doctrine\Common\Util\Debug::dump($person); exit;
3.
$result = $em->createQueryBuilder();
$person = $result->select('p')
->from('PsnPersonPsn', 'p')
->where('p.Id= 1')
->getQuery()
->getResult(\Doctrine\ORM\Query::HYDRATE_ARRAY);
echo '<pre>'; \Doctrine\Common\Util\Debug::dump($person); exit;