현재 위치: > 최신 기사 목록> pdostatement에서 연관 배열 필드를 처리하는 방법 :: FetchObject

pdostatement에서 연관 배열 필드를 처리하는 방법 :: FetchObject

gitbox 2025-05-12

데이터베이스 작업에 PDO를 사용하는 경우 Pdostatement :: FetchObject 는 매우 편리한 방법으로 쿼리 결과의 데이터 행을 객체에 직접 매핑 할 수 있습니다. 그러나 기본적으로 데이터베이스가 다른 스타일로 밑줄로 필드를 반환하거나 다른 스타일로 이름을 반환하면 FetchObject를 직접 사용하면 이러한 필드를 객체의 속성에 올바르게 매핑하지 못할 수 있습니다. 이 기사는이 상황을 우아하게 처리하는 방법을 자세히 설명합니다.

기본 사용 예제

데이터베이스 테이블 사용자에게 다음 필드가 있다고 가정합니다.

  • ID

  • user_name

  • email_address

일반적으로 우리는 이것을 쿼리 할 수 ​​있습니다.

 <?php
$pdo = new PDO('mysql:host=localhost;dbname=testdb', 'root', 'password');

$stmt = $pdo->query('SELECT id, user_name, email_address FROM users WHERE id = 1');
$user = $stmt->fetchObject();

echo $user->id;           // 정상 출력
echo $user->user_name;    // 정상 출력
echo $user->email_address; // 정상 출력
?>

여기에서 모든 것이 매끄럽게 보입니다. 그러나 엔티티 클래스 (예 : 사용자 와 같은)가 사용자 이름emailAdDdress 와 같은 Camel Naming을 사용하는 경우 FetchObject ( '사용자')를 직접 사용하면 값을 올바르게 할당하지 않습니다.

매핑이 실패하는 이유는 무엇입니까?

FetchObject는 기본적으로 데이터베이스에서 반환 한 열 이름에 따라 객체 속성에 직접 할당되므로. 데이터베이스의 필드는 밑줄이 그 밑줄이 있고 ( user_name ), 객체는 낙타 ( 사용자 이름 )이며 자연스럽게 해당하지 않습니다.

예를 들어 다음 사용자 클래스 :

 <?php
class User {
    public int $id;
    public string $userName;
    public string $emailAddress;
}
?>

$ stmt-> fetchObject ( '사용자')를 직접 사용하면 사용자 이름emailAdDress가 값을 얻을 수 없습니다.

솔루션 1 : 별칭 사용 (AS)

가장 간단하고 가장 조잡한 방법은 필드에 SQL을 쿼리 할 때 객체 속성 이름과 일치하는 별칭을 제공하는 것입니다.

 <?php
$stmt = $pdo->query('
    SELECT 
        id,
        user_name AS userName,
        email_address AS emailAddress
    FROM users
    WHERE id = 1
');

$user = $stmt->fetchObject('User');

echo $user->userName; // 올바른 출력
echo $user->emailAddress; // 올바른 출력
?>

이 방법은 엔티티 클래스를 수정하지 않고 간단하고 직접적입니다. 그러나 쿼리 필드와 복잡한 테이블이 많으면 유지하기가 쉽습니다.

해결책 2 : 수동으로 직접 매핑하십시오

필드 이름을 SQL로 유지하려면 배열을 수동으로 가져와 객체에 할당 할 수 있습니다.

 <?php
$stmt = $pdo->query('SELECT id, user_name, email_address FROM users WHERE id = 1');
$data = $stmt->fetch(PDO::FETCH_ASSOC);

$user = new User();
$user->id = $data['id'];
$user->userName = $data['user_name'];
$user->emailAddress = $data['email_address'];

echo $user->userName; // 올바른 출력
?>

이것은 유연하지만 글을 쓰는 것은 번거 롭습니다. 매번 수동으로 값을 할당해야하며, 이는 충분히 우아하지 않습니다.

고급 : 일반적인 매핑 방법의 캡슐화

보다 자동이 되려면 데이터베이스 필드를 자동으로 낙타 이름으로 변환하는 작은 기능을 작성한 다음 값을 객체에 할당 할 수 있습니다.

 <?php
function snakeToCamel(string $string): string {
    return lcfirst(str_replace(' ', '', ucwords(str_replace('_', ' ', $string))));
}

function mapToEntity(array $data, string $className) {
    $object = new $className();
    foreach ($data as $key => $value) {
        $property = snakeToCamel($key);
        if (property_exists($object, $property)) {
            $object->$property = $value;
        }
    }
    return $object;
}

// 사용의 예
$stmt = $pdo->query('SELECT id, user_name, email_address FROM users WHERE id = 1');
$data = $stmt->fetch(PDO::FETCH_ASSOC);

$user = mapToEntity($data, 'User');

echo $user->userName; // 올바른 출력
?>

이런 식으로, 변환 로직을 한 번만 작성하면되며 모든 후속 쿼리는 자동으로 처리 할 수 ​​있습니다.

주목해야 할 것

  • FetchObject 는 간단하고 빠른 데이터 수집에 적합합니다. 복잡한 논리가 필요한 경우 ORM 프레임 워크 (예 : Laravel의 웅변, Symfony의 교리 등)를 사용하는 것이 좋습니다.

  • 엔티티 클래스의 속성이 공개 되어 있는지 확인하십시오. 그렇지 않으면 FetchObject를 직접 할당 할 수 없습니다.

  • 속성을 보호 해야하는 경우 할당을 처리하기 위해 시공 방법 또는 마법 방법 __set () 와 협력해야합니다.

결론

pdostatement :: FetchObject 는 편리하지만 신중한 기능입니다. 필드 명명 스타일이 동기화되지 않은 경우 SQL에서 별칭을 사용하거나 고유 한 매핑 방법을 작성하여 코드를 깨끗하고 강력하게 유지할 수 있습니다. 중간 및 대규모 프로젝트의 경우 성숙한 ORM 라이브러리를 직접 사용하여 엔티티 매핑을 관리하여 오류의 위험을 줄이는 것이 좋습니다.

PDO, 데이터베이스 최적화 또는 엔터티 매핑에 대한 고급 팁을 보려면 더 많은 기사를 보려면 기술 블로그 https://gitbox.net/blog를 방문하십시오!