Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【PHP8.x】PDO::FETCH_GROUP定数の使い方

FETCH_GROUP定数の使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

FETCH_GROUP定数は、データベースから取得した結果セットのデータ構造を制御し、特定のカラムの値に基づいて結果をグループ化するために使用される定数です。この定数は、PHPのPDOクラスに属しており、主にPDOStatementクラスのfetchAll()メソッドのfetch_style引数として指定されます。

FETCH_GROUP定数を使用すると、SQLクエリによって取得された結果を、特定のカラムの値に基づいてグループ化して取得することができます。この定数は通常、PDO::FETCH_COLUMNと組み合わせて使用されます。その際、結果セットの最初のカラムの値がメイン配列のキーとなり、2番目以降のカラムの値がそのキーに対応するサブ配列の要素として格納される形式でデータを取得することができます。これにより、例えば「部署名」をキーとして「従業員名」のリストを取得するといった、関連性の高いデータを構造的にまとめることが可能になります。

この機能は、データベースから一度に取得したデータを、PHP側でさらに加工する手間を省き、効率的にデータを扱うことができるため、アプリケーション開発におけるデータ処理の記述を簡潔にし、可読性を向上させるメリットがあります。特定の条件でデータを整理して表示したい場合に非常に役立ち、システムエンジニアを目指す方にとって、データベースからのデータ取得と整形に関する重要な定数の一つです。

構文(syntax)

1$stmt->fetchAll(PDO::FETCH_GROUP | PDO::FETCH_ASSOC);

引数(parameters)

引数なし

引数はありません

戻り値(return)

int

PDO::FETCH_GROUPは、PDOStatement::fetch()やPDOStatement::fetchAll()メソッドで、指定したカラムの値をキーとして結果セットをグループ化するために使用される整数定数です。

サンプルコード

PDO::FETCH_GROUP で結果をグループ化する

1<?php
2
3/**
4 * PDO::FETCH_GROUP の使用方法を示すサンプルコード
5 *
6 * この関数は、データベースの結果セットを最初のカラムの値でグループ化する方法を
7 * システムエンジニアを目指す初心者向けに簡潔に解説します。
8 * SQLiteのインメモリデータベースを使用するため、事前の設定は不要で、
9 * このスクリプト単体で動作します。
10 */
11function demonstratePdoFetchGroup(): void
12{
13    // SQLiteのインメモリデータベースを使用するためのDSN (Data Source Name)
14    // データベースファイルを作成せず、メモリ上で一時的に動作します。
15    $dsn = 'sqlite::memory:';
16    $username = null; // SQLiteではユーザー名は不要
17    $password = null; // SQLiteではパスワードは不要
18
19    try {
20        // データベースに接続
21        // PDO::ATTR_ERRMODE を PDO::ERRMODE_EXCEPTION に設定することで、
22        // データベース操作でエラーが発生した際に例外がスローされ、try-catchで捕捉できます。
23        // PDO::ATTR_DEFAULT_FETCH_MODE を PDO::FETCH_ASSOC に設定することで、
24        // デフォルトで結果が連想配列として取得されるようになります。
25        $pdo = new PDO($dsn, $username, $password, [
26            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
27            PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
28        ]);
29
30        echo "データベースに接続しました。\n";
31
32        // テスト用のテーブルを作成
33        // `category_name` と `product_name` のシンプルなテーブルです。
34        $pdo->exec("
35            CREATE TABLE IF NOT EXISTS products (
36                category_name TEXT,
37                product_name TEXT
38            );
39        ");
40        echo "productsテーブルを作成または確認しました。\n";
41
42        // テストデータを挿入
43        // 毎回クリーンな状態から始めるために、既存データをクリアしてから挿入します。
44        $pdo->exec("DELETE FROM products;");
45        $pdo->exec("INSERT INTO products (category_name, product_name) VALUES ('Fruits', 'Apple');");
46        $pdo->exec("INSERT INTO products (category_name, product_name) VALUES ('Fruits', 'Banana');");
47        $pdo->exec("INSERT INTO products (category_name, product_name) VALUES ('Vegetables', 'Carrot');");
48        $pdo->exec("INSERT INTO products (category_name, product_name) VALUES ('Vegetables', 'Potato');");
49        $pdo->exec("INSERT INTO products (category_name, product_name) VALUES ('Dairy', 'Milk');");
50        echo "テストデータを挿入しました。\n";
51
52        // SQLクエリを実行し、PDO::FETCH_GROUPを使用して結果をグループ化
53        // SELECT文の最初のカラム (category_name) の値で結果がグループ化されます。
54        // ORDER BY句で結果の表示順を整理しています。
55        $stmt = $pdo->query("SELECT category_name, product_name FROM products ORDER BY category_name, product_name;");
56        $groupedResults = $stmt->fetchAll(PDO::FETCH_GROUP);
57
58        echo "\nPDO::FETCH_GROUP を使用した結果:\n";
59        echo "----------------------------------\n";
60
61        // グループ化された結果を表示
62        // $groupedResults は、カテゴリ名をキーとし、そのカテゴリに属する全行の配列を値とする連想配列になります。
63        // 例えば、'Fruits' => [['category_name' => 'Fruits', 'product_name' => 'Apple'], ...]
64        foreach ($groupedResults as $category => $products) {
65            echo "カテゴリ: " . $category . "\n";
66            foreach ($products as $product) {
67                // デフォルトのフェッチモードがPDO::FETCH_ASSOCなので、$productは連想配列です。
68                echo "  - " . $product['product_name'] . "\n";
69            }
70        }
71        echo "----------------------------------\n";
72
73    } catch (PDOException $e) {
74        // データベース接続やクエリ実行に関するエラーを捕捉します。
75        echo "データベースエラーが発生しました: " . $e->getMessage() . "\n";
76    } catch (Exception $e) {
77        // その他の予期せぬエラーを捕捉します。
78        echo "予期せぬエラーが発生しました: " . $e->getMessage() . "\n";
79    }
80}
81
82// 関数を実行して、PDO::FETCH_GROUPの動作を確認します。
83demonstratePdoFetchGroup();
84
85?>

PHPのPDO::FETCH_GROUPは、データベースから取得した結果セットを、SELECT文で指定された最初のカラムの値に基づいてグループ化するための便利な定数です。この定数自体に引数はなく、内部的にはグループ化のモードを示す整数値を返しますが、通常はPDOStatement::fetchAll()メソッドに渡してその機能を利用します。

このサンプルコードでは、SQLiteのインメモリデータベースを使用し、事前の設定なしでPDO::FETCH_GROUPの動作を体験できます。productsテーブルからcategory_nameproduct_nameを取得する際にfetchAll(PDO::FETCH_GROUP)を指定すると、結果はcategory_nameをキーとする連想配列として返されます。例えば、「Fruits」というキーの下には「Apple」や「Banana」といった、そのカテゴリに属する複数の製品データが配列でまとめられています。これにより、データベースから取得したデータをPHPのコードでより扱いやすい構造に変換し、カテゴリ別に製品リストを表示するなどの処理を簡潔に実装できるようになります。SQLの複雑なGROUP BY句を使わず、PHP側で柔軟にデータを整形したい場合に特に役立つでしょう。システムエンジニアを目指す方にとって、データベースからのデータ取得効率を向上させるための重要なテクニックの一つです。

PDO::FETCH_GROUPを使用すると、SQLのSELECT文で指定した最初のカラムの値で結果が自動的にグループ化され、連想配列として取得されます。このとき、配列のキーは最初のカラムの値、値は該当する全行の配列となります。グループ内の各行の形式は、PDO::FETCH_ASSOCなど、別途設定したフェッチモードに従いますのでご注意ください。グループ化したいカラムは、必ずSELECT文の先頭に指定する必要があります。また、データベース接続やクエリ実行時に発生するエラーは、PDO::ERRMODE_EXCEPTIONを設定し、try-catch文で適切に処理することが安全なプログラミングにおいて非常に重要です。サンプルコードは手軽なインメモリデータベースを使用していますが、実際のシステムでは適切なデータベース接続情報に置き換える必要があります。

関連コンテンツ