1 차원 스칼라 배열을 교리 dql 쿼리 결과로 얻는 방법은 무엇입니까?


116

경매 테이블의 id 열에서 값 배열을 가져오고 싶습니다. 이것이 원시 SQL이라면 다음과 같이 작성합니다.

SELECT id FROM auction

그러나 내가 교리에서 이것을하고 실행하면 :

$em->createQuery("SELECT a.id FROM Auction a")->getScalarResult(); 

다음과 같은 배열을 얻습니다.

array(
    array('id' => 1),
    array('id' => 2),
)

대신 다음과 같은 배열을 얻고 싶습니다.

array(
    1,
    2
)

교리를 사용하여 어떻게 할 수 있습니까?

답변:


197

PHP <5.5

을 사용할 수 있으며 array_map배열 당 항목 만 'current'있으므로 클로저 를 작성하는 대신 우아하게 콜백으로 사용할 수 있습니다 .

$result = $em->createQuery("SELECT a.id FROM Auction a")->getScalarResult();
$ids = array_map('current', $result);

메모리 사용량에 대한 추가 정보는 아래 Petr Sobotka의 답변을 참조하십시오 .

PHP> = 5.5

jcbwlkr가 아래대답 했듯이 array_column.


9
getScalarResult ()는 문자열을 제공합니다-정수를 원한다면 getArrayResult ()를 사용하십시오
pHoutved

그래서! array_column ()은 메모리 관리에서 더 나은가요, 아니면 foreach 방식인가요?
Dheeraj

151

PHP 5.5 부터이 문제를 해결하기 위해 array_column 을 사용할 수 있습니다.

$result = $em->createQuery("SELECT a.id FROM Auction a")->getScalarResult();
$ids = array_column($result, "id");

98

더 나은 해결책은 PDO:FETCH_COLUMN. 이렇게하려면 맞춤형 하이드 레이터가 필요합니다.

//MyProject/Hydrators/ColumnHydrator.php
namespace DoctrineExtensions\Hydrators\Mysql;

use Doctrine\ORM\Internal\Hydration\AbstractHydrator, PDO;

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

그것을 교리에 추가하십시오 :

$em->getConfiguration()->addCustomHydrationMode('COLUMN_HYDRATOR', 'MyProject\Hydrators\ColumnHydrator');

다음과 같이 사용할 수 있습니다.

$em->createQuery("SELECT a.id FROM Auction a")->getResult("COLUMN_HYDRATOR");

추가 정보 : http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/dql-doctrine-query-language.html#custom-hydration-modes



18

Ascarius의 대답은 우아하지만 메모리 사용에주의하십시오! array_map()전달 된 배열의 복사본을 만들고 메모리 사용량을 효과적으로 두 배로 늘립니다. 수십만 개의 어레이 항목으로 작업하는 경우 이것은 문제가 될 수 있습니다. 참조에 의한 PHP 5.4 호출 시간 전달이 제거되었으므로 할 수 없습니다.

// note the ampersand
$ids = array_map('current', &$result);

이 경우 당신은 분명하게 갈 수 있습니다

$ids = array();
foreach($result as $item) {
  $ids[] = $item['id'];
}

2
우리의 목표는 두 경우 모두에서 배열을 "거의 복사"하는 것이기 때문에 약간 직관적이지 않은 것처럼 보였습니다. : 나 자신이 실제로 사실 확신 할 테스트했다 gist.github.com/PowerKiKi/9571aea8fa8d6160955f
PowerKiKi을

4

교리에서는 불가능하다고 생각합니다. PHP를 사용하여 결과 배열을 원하는 데이터 구조로 변환하십시오.

$transform = function($item) {
    return $item['id'];
};
$result = array_map($transform, $em->createQuery("SELECT a.id FROM Auction a")->getScalarResult());
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.