皆様、いかがお過ごしであろうか? 日々勉強するも、それ以上に進化していくWeb業界に愕然の野地である。
いつも自分は主にWeb制作におけるフロント部分を担当していることが多いのだが、ありがたいことにデザイン領域やバックエンド領域の仕事を頂く事も多く、新卒一年目でフロント領域以外の部分も勉強する機会に恵まれている。
今回はその勉強した中から、バックエンド領域、具体的にはPHPでデータベースとのやりとりをする時に必要なPDOという仕組みを楽に使うことができるIdiormというライブラリについて記事にしようと思う。
バックエンドに関しては赤子のような自分でも直感的に扱うことができるほど分かり易い代物なので、イザ業務でPHP及びデータベースを使う際は参考にしてほしい。
目次
その前に、PDOって何よ?
正式名称をPHP Data Objectsという。
詳しくは下記URLを参照して頂きたい。
PHP 公式マニュアル
http://php.net
プログラミングを学ぶときに何かとお世話になる伊倉さんによる解説。
http://www.phpbook.jp
超ざっくり言うと、これからPHPでデータベース(以下DB)とやり取りする時は使ったほうがいいよ! っていうモノである。
なぜ使った方がいいかというと、理由は様々だが、
- PHPの標準クラスなので、今後もメンテナンスが公式に行われて安心
- PHPで構成されておらず、コアの部分の仕組みなので他のPHPで作られた仕組みより速い
- DBの種類に関係なく使える
という点が代表的なメリットではないだろうか。
PDOのの登場以前にも様々な仕組みがあったそうだが、新規に立ち上げるサービスやPHP5.1以降の環境ではとりあえずPDOを使っておけば間違いない、と考えてもよさそうである(勿論、ケースバイケースではあるが)。
だがこのPDO、プログラム言語なんて全部そうではあるのだが、初心者からすると結構扱うのが難しい。
それどころか、ベテランであっても長いコードを書くことはツライもので、PDOもプロジェクトが大きいほど、書く者を苦しめるのは間違いない。
そんなPDOを短いコードで簡単に扱おうってうことで、生まれたライブラリが今回説明するIdiormである。
乱暴に言えば、ネイティブのJavascriptに対するjQueryのようなモノと考えて差し支えない。
Idiormの準備
詳細はこの公式ページを見れば殆ど全て分かるが、全て英語で書かれている。
まず、Idiorm自体はGitHubのページ右にあるDownload ZIPのボタンを押すことでダウンロードできる。
このZIPを解凍したら中身にあるidiorm.phpをサーバーにあるプロジェクト中、任意のディレクトリに置いて、実際にコードを書くPHPファイルの先頭でrequireしよう。
そして、Idiormに使用するDB情報を設定するのだが、同じDBしか使わないのであればDB情報が入力してあるPHPファイルを一つ作り、それを各、実際に動作するPHPファイルの先頭でrequireしてやると後々効率がいい。
DB情報が保存されているdefine.php
//localhostでmysqlを使用している場合の例 <?php ORM::configure('mysql:host=localhost;dbname=データベースの名前'); ORM::configure('username', 'ユーザー名'); ORM::configure('password', 'パスワード');
実際にコードを書いてくPHPファイル
<?php require('idiorm_master/idiorm.php');//idiorm_master内にあるidiorm.phpを読み込み require('define/define.inc.php');//define内にあるdefine.inc.phpを読み込み
これで準備完了である。
単体レコードからデータを取得
Idiormでデータを取得する際、対象となるレコードが単体か複数かによって使うメソッドが違う。
単体のレコードから情報を抜き出したい場合にはfind_one()というメソッドを使う。
例えば、都道府県名が保存されているprefectureという名前のテーブルにあるIdが13のname(東京都という文字が仕込まれていると仮定)を取得したい際には
<?php require('idiorm_master/idiorm.php'); require('define/define.inc.php'); $num = 13; $record = ORM::for_table('prefecture')->where('Id',$num)->find_one(); $data = $record->name;//シングルアローでカラム名を指定することで、その値を取り出せる print $data;//東京都
というコードを書けば変数$dataの中に東京都という文字が入ってくる。
Idiormのメソッドを使う場合にはまず最初にORM::と先頭に書き、その後に->(シングルアロー)でメソッドを繋いでいくことになる。
この例は条件に対し合致するレコードが一つしかないという仮定であるが、複数合致する条件で検索したレコードの内、とあるカラムの値で降順or昇順にしたとき一番目に合致するレコードを取得したい場合は
<?php require('idiorm_master/idiorm.php'); require('define/define.inc.php'); $num = 13; //order_by_asc(昇順)もしくはorder_by_desc(降順)追加 $record = ORM::for_table('prefecture')->order_by_desc('population')->find_one(); $data = $record->name; print $data;//population(人口)が一番多い県名
という風に書けば、populationカラムの値が昇順で一番のレコードが取得できる。
第一引数にテーブル名を指定することで、操作対象のテーブルを指定。
where(‘カラム名’,値)
このメソッドの前でfor_tableやwhereで指定された範囲(指定されていなければ全範囲)で条件による絞り込みを行う。第一引数でカラム名(通常’で、変数なら”で囲って文字列にしておくこと)を指定し、第二引数で絞り込む値を入力する。
order_by_asc(‘カラム名’) & order_by_desc(‘カラム名’)
絞られたレコードをascで昇順、descで降順に並び替える。(数で言えば、1,2,3…と並ぶのが昇順(asc),46,45,44…と並ぶのが降順(desc))
find_one()
該当した条件に適合するレコードの中で、一番最初に適合したものを取得する。今回の例では変数$recordの中にレコードを格納。
複数レコードからデータを取得
複数レコードを扱うときはfind_many()メソッドを使う。
この時、各レコードの同じカラムから情報を抜き出したい時はforeach文を使うと便利だろう。
例えば、人口が少ない順で、「県」で終わる都道府県(nameTypeカラムに情報があるとする)の名前を取得する場合は
<?php require('idiorm_master/idiorm.php'); require('define/define.inc.php'); $data = array(); $records = ORM::for_table('prefecture')->where('nameType','県')->order_by_asc('population')->find_many(); foreach($records as $record){ $data[] = $record->name; } //$data = array('神奈川県','愛知県','埼玉県',...)
というコードで取得ができる。
また、条件が複数ある場合はwhereメソッドを複数繋げればいいが、いわゆるor検索がしたい場合は
<?php require('idiorm_master/idiorm.php'); require('define/define.inc.php'); $data = array(); $terms = array('都','道','府'); $records = ORM::for_table('prefecture')->where_in('nameType',$terms)->order_by_asc('population')->find_many(); foreach($records as $record){ $data[] = $record->name; } //$data = array('東京都','大阪府','京都府',...)
という風にwhere_inメソッドが使えるし、部分一致検索がしたい場合は
<?php require('idiorm_master/idiorm.php'); require('define/define.inc.php'); $data = array(); $type = '県'; $records = ORM::for_table('prefecture')->where_like('nameType',"%.$type")->order_by_asc('population')->find_many(); foreach($records as $record){ $data[] = $record->name; } //$data = array('神奈川県','愛知県','埼玉県',...);
と、where_likeメソッドを使い、後方一致なら%.キーワード、前方一致ならキーワード.%、部分一致なら%.キーワード.%としてやることで可能である。
該当した条件に適合するレコード全てを取得。
where_like(‘カラム名’,配列)
配列に格納されているいずれかの条件に合致したレコードを取得
find_many(‘カラム名’,値)
値の前方か後方、もしくは両方に%を連結することにより部分一致検索を行える
レコードを新たに追加
レコードを新たに追加するときはcreateメソッドとsaveメソッドを使う。
<?php require('idiorm_master/idiorm.php'); require('define/define.inc.php'); $record = ORM::for_table('prefecture')->create(); $record->name = '沖縄県'; $record->population = 1423000; //中略 $record->save();
まず、対象となるテーブルをfor_tableで選択したら、createメソッドを作動させ、変数$recordの中に新たに作ったレコードを格納。
そして$recordに対してシングルアローを用いて各カラムの値を仕込んでやり、最後にsave()メソッドを発動させれば新しいレコードが挿入される。このsave()は慣れてくると結構忘れがちなので注意。
指定したテーブルの末尾に新規レコードを追加
save()
レコードに加えた変更を確定させる
既存のレコードを書き換え
既存のレコードを変更するときには上記レコード追加の手順の内、create()を使っている行を既存のレコードにすれば大丈夫だ。
<?php require('idiorm_master/idiorm.php'); require('define/define.inc.php'); $record = ORM::for_table('prefecture')->where('Id',14)->find_one; $record->name = '横浜と愉快な仲間たち'; $record->save();
また、全てのレコードの同じカラムを同じ内容に一斉置換したい場合はORM::configure(‘return_result_sets’, true);の一文をdefine.inc.phpに加える、もしくはメソッドを書く前に直接書くかしてからset()メソッドを使うと良い。
<?php require('idiorm_master/idiorm.php'); require('define/define.inc.php'); ORM::configure('return_result_sets', true); $records = ORM::for_table('prefecture')->find_result_set(); $records->set('name',日本のどこか'); $records->save();
ORM::configure(‘return_result_sets’, true);を書いてから使う必要がある。foreach無しに、複数のカラムを一括操作する
set()
find_result_set(‘カラム名’,値)で指定したレコードの全てのカラムを同じ値にする。
レコードを削除
レコードを削除する場合はdelete()を使う。
<?php require('idiorm_master/idiorm.php'); require('define/define.inc.php'); $record = ORM::for_table('prefecture')->->where_like('nameType',"%.県")->find_many(); foreach($records as $record){ $record->delete(); }//「~県」だけに絞られる
指定されたレコードを削除する
まとめ
Idiormの簡単な説明だったがいかがだったろうか。
これでも難しいし複雑、と思う方もいるかもしれないが、回数を重ねて使っていけばそのうち慣れると思うので、まずはこの記事やマニュアルを見ながら頑張ってDBとやり取りしてみて欲しい。