매일 개발에서 멀티 테이블 조인트 쿼리 (예 : 조인 )는 매우 일반적인 시나리오입니다. 그러나 pdostatement :: fetchObject를 사용하여 결과를 직접 가져 오면 문제가 발생하기 쉽습니다 (예 : 다른 테이블의 이름 필드가 동일함).
이러한 충돌을 피하고 객체 속성에 올바르게 매핑하려면 합을 결합하여 우아한 데이터 추출을 달성 할 수 있습니다.
다음은 실제 기술을 자세히 설명하고 샘플 코드를 첨부합니다.
두 개의 테이블이 있다고 가정합니다.
CREATE TABLE users (
id INT PRIMARY KEY,
username VARCHAR(50)
);
CREATE TABLE profiles (
id INT PRIMARY KEY,
user_id INT,
bio TEXT
);
다중 테이블 쿼리 결과를 매핑하려면 다음과 같은 특수 클래스를 만들 수 있습니다.
<?php
class UserProfile
{
public $user_id;
public $username;
public $profile_id;
public $bio;
}
여기에 필드 이름을 주목하고 user_id 및 profile_id 와 같은 구별이 이루어졌습니다.
핵심은 쿼리 필드에 적절한 별칭을 설정하여 FetchObject를 직접적으로 할당 할 수 있도록하는 것입니다.
<?php
$pdo = new PDO('mysql:host=localhost;dbname=testdb', 'root', 'password');
// 다중 테이블 조인트 쿼리,그리고 분야의 별칭
$sql = "
SELECT
u.id AS user_id,
u.username,
p.id AS profile_id,
p.bio
FROM
users u
INNER JOIN
profiles p ON u.id = p.user_id
";
$stmt = $pdo->query($sql);
// 직접 사용하십시오 fetchObject 지도에 UserProfile 물체
while ($userProfile = $stmt->fetchObject('UserProfile')) {
echo "사용자ID: {$userProfile->user_id}\n";
echo "사용자名: {$userProfile->username}\n";
echo "소개: {$userProfile->bio}\n";
echo "---\n";
}
이것의 장점은 현장 충돌을 피하고 동시에 객체 구조가 명확하다는 것입니다. 예를 들어 프론트 엔드 API 인터페이스 또는 데이터 처리로 전달하는 것과 같이 나중에 사용하기 쉽습니다.
예를 들어, 동적 구조를 만나면 더 유연하게 원한다면 미리 준비된 STDCLASS 또는 특성을 사용하여 매핑 로직과 협력 할 수 있습니다.
예:
<?php
class DynamicUserProfile
{
public function __construct(array $data)
{
foreach ($data as $key => $value) {
$this->$key = $value;
}
}
}
$stmt = $pdo->query($sql);
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
$dynamicProfile = new DynamicUserProfile($row);
echo "사용자名: {$dynamicProfile->username}, 소개: {$dynamicProfile->bio}\n";
}
이 방법은 더 유연하지만 FetchObject 의 기본 지원보다 성능이 약간 낮으므로 실제 요구에 따라 선택해야합니다.
필드 별칭은 표준화, 특히 멀티 테이블 쿼리를 표준화해야합니다 .
객체 속성 이름은 SQL의 필드 별명에 엄격하게 해당해야합니다 .
큰 프로젝트 인 경우 매핑 세부 사항을 자동으로 처리하기 위해 매퍼 툴 클래스를 작성하는 것이 좋습니다.
https://gitbox.net/api/user/profile 과 같은 인터페이스로 객체 데이터를 전송하는 등 외부 인터페이스 또는 플랫폼에 연결하면 명확한 객체 구조를 사용하여 오류율이 크게 줄어 듭니다.