PHPとPDOを使用して毎日データベースを操作する場合、 PDOSTATEMENT :: FETCHOBJECTは非常に便利な方法であり、クエリ結果をオブジェクトに直接変換できます。ただし、デフォルトでは作成のみが作成され、より複雑さを自動的に処理しません。プロファイルオブジェクトをネストするユーザーオブジェクトなど、ネストされたオブジェクトを含めるように結果を含める場合は、自分で処理する必要があります。
この目標を段階的に達成する方法を見てみましょう。
このような2つのテーブルがあるとします。
CREATE TABLE users (
id INT PRIMARY KEY,
name VARCHAR(100),
profile_id INT
);
CREATE TABLE profiles (
id INT PRIMARY KEY,
bio TEXT,
avatar_url VARCHAR(255)
);
プロファイルオブジェクトをネストしながら、ユーザーデータを照会し、結果をユーザーオブジェクトに変換します。
たとえば、これに似た構造を取得したいと考えています。
User {
id => 1,
name => 'Alice',
profile => Profile {
id => 2,
bio => 'Hello world!',
avatar_url => 'https://gitbox.net/uploads/avatar.jpg'
}
}
ユーザーとプロフィールのPHPクラスを作成する必要があります。
class Profile {
public int $id;
public string $bio;
public string $avatar_url;
}
class User {
public int $id;
public string $name;
public Profile $profile;
}
参加クエリを使用して、2つのテーブルからデータを一度に取得できます。
$sql = "
SELECT
u.id AS user_id,
u.name AS user_name,
p.id AS profile_id,
p.bio AS profile_bio,
p.avatar_url AS profile_avatar_url
FROM users u
JOIN profiles p ON u.profile_id = p.id
";
$stmt = $pdo->query($sql);
FetchObjectはデフォルトでデータの1層のみをマッピングするため、ネストされたオブジェクトを自分で組み立てる必要があります。あなたはこれを行うことができます:
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
$user = new User();
$user->id = (int) $row['user_id'];
$user->name = $row['user_name'];
$profile = new Profile();
$profile->id = (int) $row['profile_id'];
$profile->bio = $row['profile_bio'];
$profile->avatar_url = $row['profile_avatar_url'];
$user->profile = $profile;
// 今 $user ネストが含まれています Profile のオブジェクト
var_dump($user);
}
これに対処する必要がある場合は、ガジェット関数にカプセル化できます。
function mapRowToUser(array $row): User {
$user = new User();
$user->id = (int) $row['user_id'];
$user->name = $row['user_name'];
$profile = new Profile();
$profile->id = (int) $row['profile_id'];
$profile->bio = $row['profile_bio'];
$profile->avatar_url = $row['profile_avatar_url'];
$user->profile = $profile;
return $user;
}
// 使用
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
$user = mapRowToUser($row);
var_dump($user);
}
pdostatement :: fetchobject自体はネストされたオブジェクトを直接作成することはできませんが、手動の割り当てとカプセル化を介して複雑なデータ構造マッピングを実装することは非常に柔軟です。この方法は、より明確で、単純な配列処理よりも安全であり、最新のPHPオブジェクト指向の開発習慣に沿ったものです。
さらに簡素化したい場合は、ORMツール(Eloquent、Doctrineなど)を組み合わせてこれらのマッピングを自動的に処理することを検討できますが、軽量プロジェクトでは、このマニュアルマッピング方法ですでに十分です!