フルスタックエンジニアのノウハウ
2020.03.19    2022.06.12

フェッチモードとは?PDOのfetchパターンを理解する

この記事の動画版はこちら(画像クリックでYoutubeに飛びます)

チャンネル登録お願いします!


フェッチモードとは何か?


フェッチモードとは、PDOでデータベースからデータを取り出した際の「配列の形式を指定するモード」のことです。


fetch(フェッチ)は、日本語で「取得する」という意味です。


フェッチモードを指定しなくてもデータは取得出来ますが(デフォルトのモードが適用)、指定することでデータ配列の形式をカスタマイズすることが出来ます。



フェッチモードの指定方法


フェッチモードは、以下のように「fetch()」や「fetchAll()」の引数として指定します。


例1)

$user = $stmt->fetch(PDO::FETCH_BOTH);


例2)

$user_list = $stmt->fetchAll(PDO::FETCH_BOTH);


指定出来るモードは、PDOクラスの中で定数として定められています。



どのようなモードがあるのか?


まず、よく使う基本パターンは以下の4つです。


①FETCH_BOTH:【配列のキー】カラム名連番
②FETCH_ASSOC:【配列のキー】カラム名のみ
③FETCH_KEY_PAIR:指定した2つのカラムを「キー/値」のペアの配列にする
④FETCH_COLUMN:指定した1つのカラムだけを1次元配列で取得


何も指定しない場合は「FETCH_BOTH」になります。



また、fetchAll()で指定出来る追加のオプションとして以下の2つがあります。


FETCH_UNIQUE:親配列のキーを連番ではなく指定カラムにする
FETCH_GROUP:親配列を指定カラムでグルーピングする


これらは、基本の指定と合わせて以下のように指定します。


fetchAll(PDO::FETCH_ASSOC|PDO::FETCH_UNIQUE);


では、それぞれのモードで実際に取得される配列の例を見てみましょう。



実際に取得される配列パターン



FETCH_BOTH(デフォルト)


$stmt = $pdo->query("SELECT * FROM user");

$user_list = $stmt->fetchAll(PDO::FETCH_BOTH);


FETCH_BOTHでは、配列のキーは「カラム名」「連番」の2タイプが準備されます。




 連番指定でもカラム指定でもデータにアクセス出来るので便利ですが、データを2倍保持することになるのでリソースを無駄にしてしまいます。



FETCH_ASSOC


$stmt = $pdo->query("SELECT * FROM user");

$user_list = $stmt->fetchAll(PDO::FETCH_ASSOC);


FETCH_ASSOCは、配列のキーは「カラム名」のみが準備されます。




 無駄なデータを持たなくて済むので、基本はこのモードがおすすめです。



FETCH_KEY_PAIR


$stmt = $pdo->query("SELECT mail_address, name FROM user");

$user_list = $stmt->fetchAll(PDO::FETCH_KEY_PAIR);


指定した2つのカラムを「キー」「値」ペアにした配列として取得します。




 例えば、IDとユーザー名、メールアドレスとユーザー名など、特定の2つのカラムだけをリストで取り出したい場合に便利です。



FETCH_COLUMN


$stmt = $pdo->query("SELECT name FROM user");

$user_list = $stmt->fetchAll(PDO::FETCH_COLUMN);


指定した1つのカラムだけ1次元配列として取得します。




 1つのカラムのデータだけを取り出したい場合にはこのモードが便利です。



FETCH_UNIQUEとFETCH_GROUPの使い方


FETCH_UNIQUEとFETCH_GROUPは、fetchAll()の場合のみ指定することが出来ます。


これらを使用することで、処理を行いやすいようにデータリストを整形することが出来ます。



FETCH_UNIQUE


$stmt = $pdo->query("SELECT * FROM user");

$user_list = $stmt->fetchAll(PDO::FETCH_ASSOC|PDO::FETCH_UNIQUE);


行(親配列)のキーを連番ではなく指定カラムに出来ます。




 親配列のキーを、0から始まる連番ではなくIDカラムの値にするといったことが出来ます。



FETCH_GROUP


$stmt = $pdo->query("SELECT gender, name FROM user");

$user_list = $stmt->fetchAll(PDO::FETCH_COLUMN|PDO::FETCH_GROUP);


行(親配列)を指定カラムでグルーピングします。




 特定カラムでグルーピングして表示したい場合に便利です。



まとめ


現場のコツ
デフォルトは①FETCH_BOTHですが、配列のデータ量が倍になってしまうため、基本的には②FETCH_ASSOCを指定し、1カラムしか取り出さない場合は④FETCH_COLUMN2カラムの場合は③FETCH_KEY_PAIRを使うのがおすすめです。


フェッチモードを理解して、無駄のないデータ取得を行うようにしましょう!



なお、PHPからデータベースを操作する手順については以下の記事で詳しく解説しています。

関連記事

PHPからデータベースを操作する手順



おすすめ記事