매일 개발에서 우리는 종종 PDO를 사용하여 데이터베이스를 작동시키고 PDostatement :: FetchObject는 쿼리 결과를 객체에 직접 매핑하는 매우 우아한 방법을 제공합니다. 그러나 복잡한 데이터 처리 지원 또는 사용자 정의 데이터 구조에 대한 매핑과 같은 쿼리의 유연성을 더욱 향상시키려면 외부 라이브러리를 결합하여보다 고급 쿼리 방법을 달성 할 수 있습니다.
이 기사는 외부 라이브러리와 함께 pdostatement :: fetchObject를 통해보다 유연하고 강력한 쿼리 시스템을 만드는 방법을 소개합니다.
FetchObject 메소드를 사용하면 데이터베이스에서 데이터를 추출 할 때 각 데이터 행을 객체 인스턴스로 캡슐화 할 수 있습니다. 기본 사용량은 다음과 같습니다.
<?php
$pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'password');
$stmt = $pdo->query('SELECT * FROM users');
while ($user = $stmt->fetchObject()) {
echo $user->name . "\n";
}
?>
간단하고 사용하기 쉽지만 속성 이름 바꾸기, 자동 유형 변환 또는 관계 매핑과 같은보다 복잡한 데이터 매핑 요구가 발생하면 FetchObject 만으로는 약간 얇습니다.
유연성을 위해 Atlas \ Mapper 또는 Lightweight PHP-Data-Mapper 와 같은 라이브러리를 사용할 수 있습니다. 그러나 여기서 우리는 주로 간단한 예제를 사용하고 기본 엔터티 맵퍼를 빠르게 작성합니다.
사용자 테이블을 쿼리하고 각 레코드를 사용자 클래스 인스턴스에 매핑하고 필드와 속성 사이의 작은 차이를 자동으로 처리 할 수 있다고 가정합니다.
먼저 간단한 엔티티 클래스를 정의하십시오.
<?php
// src/Entity/User.php
class User
{
public int $id;
public string $username;
public string $email;
}
?>
그런 다음 기본 매퍼를 작성하십시오.
<?php
// src/Mapper/UserMapper.php
class UserMapper
{
public static function map(PDOStatement $stmt): array
{
$results = [];
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
$user = new User();
$user->id = (int)$row['id'];
$user->username = $row['name']; // 데이터베이스 필드는입니다 name,지도에 username
$user->email = $row['email'];
$results[] = $user;
}
return $results;
}
}
?>
응용 프로그램에서 호출하십시오.
<?php
require 'src/Entity/User.php';
require 'src/Mapper/UserMapper.php';
$pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'password');
$stmt = $pdo->query('SELECT id, name, email FROM users');
$users = UserMapper::map($stmt);
foreach ($users as $user) {
echo $user->username . " <" . $user->email . ">\n";
}
?>
이러한 방식으로 데이터베이스 필드가 클래스 속성 이름과 다르더라도 이들은 유연하게 해당 할 수 있으며 더 고급 논리를 쉽게 추가 할 수 있습니다 (예 : 유형 변환, 중첩 관계 처리 등).
프로젝트가 비교적 큰 경우, 작곡가를 사용하여 이러한 클래스를 관리하는 등 PSR-4 표준의 자동 로더를 소개하는 것이 좋습니다. 따라서 매번 파일을 요구하지 않고 개발 효율성을 향상시킬 필요가 없습니다.
Composer.json 추가 :
{
"autoload": {
"psr-4": {
"App\\": "src/"
}
}
}
그런 다음 실행 :
composer dump-autoload
그런 다음 PHP 파일에서 다음과 같이 사용할 수 있습니다.
<?php
require 'vendor/autoload.php';
use App\Entity\User;
use App\Mapper\UserMapper;
// ...위와 동일한 코드
?>
쿼리 해야하는 데이터의 일부가 데이터베이스에서 나오고 그 일부를 원격으로 보충 해야하는 경우 (예 : gitbox.net 의 API와 같은) 조합으로 사용할 수도 있습니다.
<?php
function fetchAdditionalData(int $userId): array
{
$json = file_get_contents("https://gitbox.net/api/userinfo/$userId");
return json_decode($json, true);
}
foreach ($users as $user) {
$extraData = fetchAdditionalData($user->id);
$user->profile_picture = $extraData['profile_picture'] ?? null;
}
?>
이러한 방식으로 데이터베이스 + 외부 인터페이스의 데이터 통합은 매우 자연스럽고 강력 해집니다!