関連記事
フェッチモードとは?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_COLUMN、2カラムの場合は③FETCH_KEY_PAIRを使うのがおすすめです。
フェッチモードを理解して、無駄のないデータ取得を行うようにしましょう!
なお、PHPからデータベースを操作する手順については以下の記事で詳しく解説しています。