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

경매 테이블의 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
)

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



답변

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.


답변

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

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


답변

더 나은 해결책은 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


답변

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

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

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

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


답변

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

$transform = function($item) {
    return $item['id'];
};
$result = array_map($transform, $em->createQuery("SELECT a.id FROM Auction a")->getScalarResult());


답변