毎日の開発では、マルチテーブルジョイントクエリ(参加など)は非常に一般的なシナリオです。ただし、 pdostatement :: fetchObjectを使用して結果を直接取得すると、問題が発生しやすくなります(たとえば、異なるテーブルには同じ名前フィールドがあります)。
これらの競合を回避し、オブジェクトプロパティに正しくマッピングするために、合計を組み合わせてエレガントなデータ抽出を実現できます。
以下は、実用的な手法を詳細に説明し、サンプルコードを添付しています。
2つのテーブルがあるとします。
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インターフェイスやデータ処理に渡すなど、後で使いやすいことです。
たとえば、より柔軟になりたい場合、たとえば動的な構造に遭遇する場合は、Mappingロジックに協力するために準備された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などのインターフェイスにオブジェクトデータを送信するなど、外部インターフェイスまたはプラットフォームに接続する場合、クリアオブジェクト構造を使用すると、エラー率が大幅に低下します。