반응형
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");
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());
반응형
'IT' 카테고리의 다른 글
PHP에서 파일에 새 줄 쓰기 (줄 바꿈) (0) | 2020.08.18 |
---|---|
MS 액세스에 대한 좋은 무료 대안 (0) | 2020.08.18 |
신속하게 navigationBar에서 제거 (0) | 2020.08.18 |
Windows 7 64 비트에서 DLL 파일을 등록하고 있습니까? (0) | 2020.08.18 |
UITableView의 배경을 터치하여 키보드 닫기 (0) | 2020.08.18 |