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'콜백(callback)으로 사용할 수 있습니다.

$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 DoctrineExtensionsHydratorsMysql;
use DoctrineORMInternalHydrationAbstractHydrator, PDO;
class ColumnHydrator extends AbstractHydrator {
protected function hydrateAllData()
{
return $this->_stmt->fetchAll(PDO::FETCH_COLUMN);
} } 

독트린에 추가:

$em->getConfiguration()->addCustomHydrationMode('COLUMN_HYDRATOR', 'MyProjectHydratorsColumnHydrator'); 

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

$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




아스카리우스의 답변은 우아하지만 기억력 사용에 주의하세요! array_map()는 전달된 어레이의 복사본을 생성하여 메모리 사용량을 효과적으로 두 배로 늘립니다.수십만 개의 어레이 항목을 사용하는 경우 이 문제가 발생할 수 있습니다.PHP 5.4 call-time pass-by reference가 삭제되었기 때문에 할 수 없습니다.

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

그럼 넌 당연한 걸로 가도 돼

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



https://www.doctrine-project.org/projects/doctrine-orm/en/2.10/reference/dql-doctrine-query-language.html#scalar-column-hydration 를 참조해 주세요.이것에 대한 솔루션도 짜넣어져 있습니다.

use DoctrineORMAbstractQuery;
$query = $em->createQuery("SELECT a.id FROM Auction a"); return $query->getSingleColumnResult(); // Same as: return $query->getResult(AbstractQuery::HYDRATE_SCALAR_COLUMN);