경매 테이블의 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");
답변
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());