데이터베이스 작업에 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가 값을 얻을 수 없습니다.
가장 간단하고 가장 조잡한 방법은 필드에 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; // 올바른 출력
?>
이 방법은 엔티티 클래스를 수정하지 않고 간단하고 직접적입니다. 그러나 쿼리 필드와 복잡한 테이블이 많으면 유지하기가 쉽습니다.
필드 이름을 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를 방문하십시오!