現在の位置: ホーム> 最新記事一覧> pdostatement :: fetchObjectでのDateTime形式を処理する方法

pdostatement :: fetchObjectでのDateTime形式を処理する方法

gitbox 2025-05-12

PHPのPDOを使用してデータベースを操作する場合、 pdostatement :: fetchObject()メソッドは非常に便利で、クエリ結果をオブジェクトに直接マッピングできます。ただし、データベースフィールドに( DateTimeタイムスタンプタイプなど)が含まれる場合、通常の文字列として処理される日付フィールドなど、 FetchObjectを使用して直接問題に遭遇する可能性があります。これにより、後続のフォーマットと比較が面倒になります。

この記事では、 FetchObjectを使用するときにこれらのDateTimeフィールドを正しく処理する方法を説明し、実用的な例を示します。

問題の背景

ユーザーテーブルユーザーがいるとします。構造は次のとおりです。

 CREATE TABLE users (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(255) NOT NULL,
    created_at DATETIME NOT NULL
);

データを挿入します:

 INSERT INTO users (name, created_at) VALUES ('Alice', '2025-04-27 14:30:00');

FetchObjectを使用してデータを取得します。

 <?php
$pdo = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');
$stmt = $pdo->query('SELECT * FROM users WHERE id = 1');
$user = $stmt->fetchObject();

echo $user->created_at;
?>

出力は通常の文字列です。

 2025-04-27 14:30:00

created_atに追加、減算、形式、その他の操作を追加する場合は、 DateTimeクラスで手動で変換する必要があります。これは非常に不可能です。

日付と時刻のフィールドを正しく処理する方法

それを優雅に処理する2つの一般的な方法があります:

方法1:フィールドを手動で変換します

オブジェクトを取得した後、日付フィールドをすぐにDateTimeオブジェクトに変換します。

 <?php
$pdo = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');
$stmt = $pdo->query('SELECT * FROM users WHERE id = 1');
$user = $stmt->fetchObject();

if ($user && isset($user->created_at)) {
    $user->created_at = new DateTime($user->created_at);
}

// これで直接使用できます DateTime 方法
echo $user->created_at->format('Y年m月d日 H:i:s');
?>

この方法は簡単ですが、毎回手動で変換する必要があります。テーブル構造が複雑な場合、または多くのフィールドがある場合、メンテナンスコストが増加します。

方法2:カスタムエンティティクラスを使用します(推奨)

エンティティクラスを作成し、対応する属性タイプを定義し、コンストラクターの日付と時刻を自動的に処理します。

 <?php
class User
{
    public int $id;
    public string $name;
    public DateTime $created_at;

    public function __construct()
    {
        // 元の文字列を追加する必要があります created_at に変換します DateTime 物体
        if (is_string($this->created_at)) {
            $this->created_at = new DateTime($this->created_at);
        }
    }
}
?>

FetchObjectを使用するときにクラス名を指定します。

 <?php
$pdo = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');
$stmt = $pdo->query('SELECT * FROM users WHERE id = 1');
$user = $stmt->fetchObject(User::class);

echo $user->created_at->format('Y-m-d H:i:s');
?>

これを行うことの利点は次のとおりです。

  • コードはより明確です

  • フィールド処理の欠落は避けてください

  • オブジェクト構造はより標準化されているため、IDEが自動的に完了しやすくなります

  • 大規模なプロジェクトや長期的なメンテナンスに適しています

注意すべきこと

PHPバージョンがサポートしている場合は、PHP 8.0で導入されたコンストラクタープロパティプロモーションなどのプロパティタイプの宣言を組み合わせて、エンティティクラスの執筆をさらに簡素化できます。

同時に、データベースによって返されるフィールド形式が常にISO標準( YYYY-MM-DD HH:MM:SS )に準拠していることを確認して、データタイムの解析障害を回避します。

まとめ

pdostatement :: fetchobject()を使用する場合、直接返される日付と時刻のフィールドは文字列です。エレガントな治療が必要な場合は、お勧めします。

  • 小さなアイテムは、削除後に手動でdateTimeに変換できます

  • 大規模なプロジェクトまたは標準化された開発では、カスタムエンティティクラスを使用することを強くお勧めします。

エンティティクラスを合理的に設計することにより、コードの堅牢性と保守性を大幅に改善できます。

PDOの使用のヒントについて詳しく知りたい場合は、公式ドキュメントを参照できます。