Native SQL을 사용하는 Dutrinction Orm 2 재귀 쿼리
저는 심포니 프레임워크를 사용하고 있으며, 그것은 데이터베이스와 대화하기 위해 독트린 옴 2와 DQL을 사용합니다.그러나 DQL은 재귀 쿼리를 지원하지 않습니다.또한 결과 집합 매핑과 함께 Native SQL을 사용하여 DQL이 지원하지 않는 고급 쿼리를 만들 수 있는 옵션을 제공합니다.
이제 당면한 과제로 넘어갑니다.그룹 ID가 주어졌을 때 부모 ID가 NULL과 동일한 루트 그룹에 도달할 때까지 그룹의 부모 ID와 부모 ID의 배열을 반환하는 함수를 작성하려고 합니다.예를 들어 함수에 3을 전달하면 {3,2,1}이 반환되고, 2를 전달하면 {2,1}이 반환되며, 1을 전달하면 {1}이 반환됩니다.
그런 그룹 테이블이 있습니다.
| Group Id | Parent Id |
| 1 | NULL |
| 2 | 1 |
| 3 | 2 |
이 문제에 대한 저의 현재 해결책은 그룹 ID의 상위 항목을 반환하고 루트 그룹에 도달할 때까지 데이터베이스를 계속해서 쿼리하는 것입니다.그러나 한 번의 쿼리로 이 모든 작업을 수행할 수 있다면 서버/DB가 처리해야 할 오버헤드가 훨씬 줄어들 것입니다.저도 재귀 쿼리에 익숙하지 않지만, 재귀 쿼리에 대해 자세히 알아가면서 진행 상황을 업데이트하겠습니다.
update 1: 이것은 제가 지금까지 가지고 있는 코드입니다, 저는 또한 재귀 cte 지원이 구현되었을 때와 마찬가지로 maria db 10.2로 업데이트해야 했습니다.저는 현재 where 절의 구문 오류를 처리하고 있습니다.
public function getGroupOwnershipChain($group_id){
$rsm = new ResultSetMapping();
$rsm->addEntityResult('Bundle:Group', 'u');
$rsm->addFieldResult('u', 'id', 'id');
$rsm->addFieldResult('u', 'parent', 'parent');
$query = $this->em->createNativeQuery('
with recursive cte as (
SELECT u.id, u.parent
WHERE u.id = ?
FROM group
UNION ALL
SELECT e.id, e.parent
FROM cte c
JOIN group e ON e.id = c.parent
)
SELECT *
FROM cte;', $rsm);
$query->setParameter(1, $group_id);
return $query->getResult();
}
public function getGroupOwnershipChain($group_id){
$rsm = new ResultSetMapping();
$rsm->addEntityResult('Bundle:Group', 'u');
$rsm->addFieldResult('u', 'id', 'id');
$rsm->addFieldResult('u', 'parent', 'parent');
$query = $this->em->createNativeQuery('
with recursive cte as (
SELECT u.id, u.parent
WHERE u.id = ?
FROM group
UNION ALL
SELECT e.id, e.parent
FROM cte c
JOIN group e ON e.id = c.parent
)
SELECT *
FROM cte;', $rsm);
$query->setParameter(1, $group_id);
return $query->getResult();
}
재귀 앵커의 from과 where 절을 뒤집어야 했습니다.이제는 잘 작동합니다.
언급URL : https://stackoverflow.com/questions/43700168/doctrine-orm-2-recursive-query-with-native-sql
'programing' 카테고리의 다른 글
홈브루를 사용하여 맥에 파이썬 2와 3을 모두 설치하려면 어떻게 해야 합니까? (0) | 2023.07.20 |
---|---|
Spring @Value("${}")는 종종 null입니다. (0) | 2023.07.15 |
SQL - COALESCE와 ISNULL의 차이? (0) | 2023.07.15 |
SQL Server에서 열이 참조되는 모든 위치를 어떻게 찾을 수 있습니까? (0) | 2023.07.15 |
SQL Server에서 데이터베이스의 테이블에 읽기 및 쓰기 액세스 권한을 부여하는 T-SQL이란 무엇입니까? (0) | 2023.07.15 |