옥션 테이블의 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);