毎日の開発では、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や軽量の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";
}
?>
このようにして、データベースフィールドがクラス属性名と異なる場合でも、それらに柔軟に対応することができ、より高度なロジックを簡単に追加できます(タイプ変換、ネストされた関係処理など)。
プロジェクトが比較的大きい場合は、Composerを使用してこれらのクラスを管理するなど、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;
}
?>
このようにして、データベース +外部インターフェイスのデータ統合は非常に自然で強力になります!