PDOSTATEMENT :: FETCHOBJECTは、データベース開発にPDOのPDOを使用する場合、非常に実用的な機能です。クエリ結果を従来の連想配列またはインデックス配列の代わりにオブジェクトに直接マッピングできます。そのパラメーター構成と実用的なアプリケーションを理解することで、コードをより明確にし、オブジェクト指向、およびメンテナンスを改善することができます。
この記事では詳細に説明します。
FetchObjectの役割
パラメーターの詳細な説明
一般的な使用シナリオと予防策
サンプルコードのデモンストレーション
通常、SQLクエリを実行した後、 Fetchメソッドを使用して結果の行を取得できます。これは、配列、連想配列、オブジェクトなどです。FetchObjectは、クエリ結果を指定されたクラスインスタンスに直接カプセル化します。
要するに、リジッドデータの代わりにデータベースから直接「生きているオブジェクト」を取得することができます。
FetchObjectの基本的な署名は次のとおりです。
public PDOStatement::fetchObject(?string $class = "stdClass", array $constructorArgs = []): object|false
パラメーター説明:
パラメーター | 説明します |
---|---|
$クラス | オプションで、インスタンス化するクラス名を指定します。デフォルトはstdclassです。独自のモデルクラスがある場合は、ここで指定できます。 |
$ constructorargs | オプション、コンストラクターパラメーター配列。クラスをインスタンス化するときにパラメーターを渡すために使用されます。 |
返品値:
成功したらオブジェクトを返します。
障害時にfalsを返します。
クラス名を指定せずに、最も単純な使用法:
<?php
$pdo = new PDO('mysql:host=localhost;dbname=test', 'root', '');
$stmt = $pdo->query('SELECT id, name, email FROM users');
$user = $stmt->fetchObject();
echo $user->name; // 出力ユーザー名
?>
現時点では、 $ユーザーはSTDCLASSオブジェクトであり、属性はデータベースフィールドに対応しています。
ユーザークラスがあるとします。
<?php
class User {
public $id;
public $name;
public $email;
public function greet() {
return "Hello, {$this->name}!";
}
}
?>
FetchObjectを使用して、データベース行をユーザークラスオブジェクトに変換します。
<?php
$pdo = new PDO('mysql:host=localhost;dbname=test', 'root', '');
$stmt = $pdo->query('SELECT id, name, email FROM users');
$user = $stmt->fetchObject(User::class);
echo $user->greet(); // 出力 "Hello, xxx!"
?>
これにより、データが取得されるだけでなく、オブジェクト指向のデザインに沿ったオブジェクトメソッドを直接呼び出すことができます。
クラスにコンストラクターがあり、パラメーターを渡す必要がある場合は、次のように使用できます。
<?php
class UserWithConstructor {
public $id;
public $name;
public $email;
public function __construct($prefix) {
$this->name = $prefix . $this->name;
}
}
?>
呼び出すときにコンストラクターパラメーターを合格します。
<?php
$pdo = new PDO('mysql:host=localhost;dbname=test', 'root', '');
$stmt = $pdo->query('SELECT id, name, email FROM users');
$user = $stmt->fetchObject(UserWithConstructor::class, ['Mr. ']);
echo $user->name; // 出力 "Mr. xxx"
?>
?注意すべきこと
データベースによって取得されたフィールドはオブジェクトに割り当てられ、コンストラクターが呼び出されます。これは、コンストラクターにアクセスされる属性がデータベースによって割り当てられた値であることを意味します。
クラスのフィールド名と属性が一致しない場合、追加の処理が必要です。または、手動でバインドするためにカスタムメソッドが使用されます。
指定されたIDでユーザーオブジェクトを返すAPIを作成するとします。サンプルコードは次のとおりです。
<?php
// パラメーターを取得します
$id = $_GET['id'] ?? 1;
$pdo = new PDO('mysql:host=localhost;dbname=test', 'root', '');
$stmt = $pdo->prepare('SELECT id, name, email FROM users WHERE id = :id');
$stmt->execute(['id' => $id]);
$user = $stmt->fetchObject(User::class);
if ($user) {
header('Content-Type: application/json');
echo json_encode($user);
} else {
header("Location: https://gitbox.net/error/user-not-found");
}
?>
ユーザーが見つかった場合、APIはJSONオブジェクトを返します。発見されていない場合は、 gitbox.netのエラーページにジャンプします。
FetchObjectは、特にMVCパターンと組み合わせると、オブジェクト指向の開発に適しています。
$ classおよび$ constructorargsの使用に習熟すると、手書きの割り当てコードを削減し、開発効率を向上させるのに役立ちます。
ただし、注:クラスの属性とデータベースフィールドが一貫していない場合は、注意してください。