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

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

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

こんにちは、徳田 啓です。
Webプログラマー歴20年、【フルスタックエンジニア マスター講座】を運営しています。(生徒数1,800名突破)

今回は「PDOのフェッチモード」について解説します。

  • ・フェッチモードとは何か?
  • ・FETCH_ASSOC、FETCH_BOTHの違いがよく分からない。
  • ・FETCH_UNIQUEやFETCH_GROUPの使い方が分からない。

このような疑問を解消していきます!


この記事の動画版はこちら

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



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


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

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

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


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


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

例)

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


$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);

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

  • 親配列のキーを、連番ではなく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_COLUMN、2カラムの場合は③FETCH_KEY_PAIRを使うのがおすすめです。

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


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

関連記事

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



おすすめ記事
無料メルマガ配信中