programing

Native SQL을 사용하는 Dutrinction Orm 2 재귀 쿼리

i4 2023. 7. 15. 09:41
반응형

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

반응형