フレームワークはどれも似たような、アクセス方法を提供していますね。流行りはメソッドチェーンで結んでいく指定方法です。私もこの方法が好きです。
勘弁して欲しいのが、フレームワークによってはせっかくこうしたメソッドを使っても、指定する順番がそのままコード出力の順番になっていて、順番間違えるとSQLエラーになることです。内部で正しく並び替えくらいやってもらいたいものですね。
今回、私はORMなど高度な機能は使わず、かと言って、直接SQLを実行する方法でもなく、いつものとおり、提供してくれるメソッドをチェーンでつないで書く方法で、やってます。スピードと分かりやすさ、そしてエスケープによる安心感が得られます。
Fuelのセレクトはこんな感じです。順番は適当に指定していますので、エラーになるかも知れません。(あとで自分で、あのメソッドなんだっけかな、と想い出すために、付けられるもの付けるだけ付けた「セットで特盛」状態です。「join」とか、入れていないので、メガ盛りではありませんね。):
$result = DB::select('id','username', 'password')->where_open()->where('name', 'John')->and_where('email', ' このメールアドレスは、スパムロボットから保護されています。アドレスを確認するにはJavaScriptを有効にしてください ')->where_close()->or_where_open() ->where('name', 'mike')->or_where('name', 'dirk')->or_where_close()->from('users')->order_by('name','asc')->order_by('surname', 'desc')->as_object()->limit(10)->offset(5)->execute()
結果は連想配列で戻ります。オブジェクトで受け取りたいときは、as_object()を使います。明示的に連想配列を指定したければ、as_assoc()を付けます。
結果の件数を知りたいときは、count($result)です。
この$resultですが、直接foreachで回せます。確か、前にテストで試した時、このやり方で、結果が読めました。(記憶に頼っているので、間違っているかも知れません。)
foreach($result as $r) {
// 連想配列で受けた場合
$id = $r['id'];
$user_name = $r['username'];
$password = $r['password'];
// オブジェクトで受けた場合
$id = $r->id;
$user_name = $r->username;
$password = $r->password;
}
マニュアルには、このように直接回せるよ、と書かれており、何故かその下に更に配列に変換してくれるメソッドも紹介されていました。(これもうる覚えです。)
$result_array = $result->as_array();
foreach($result_array as $item){
$id = $item['id'];
$user_name = $item['username'];
$password = $item['password'];
}
どうしてこんな手間をかけるメソッドがあるのかと思いました。この時は、オブジェクトで受けたものを配列に変換したいときに使用するのかなと思いました。
それにしては、デフォルトで連想配列なのだから、デフォルトで初めから受ければいいのではないかと、感じていました。
やっと今回、納得できたのは、出力のため、ビューと絡ませてからです。直接回せるのなら、特に加工が必要ないならば、ビューに渡して、ビューで回せばいいかと、実行したら、DBのオブジェクトには書き込めないとエラーになりました。書き込んでないので「何で?」と思いましたが、直ぐにデフォルトで出力にはフィルターがかかっていることを思い出し、これが書き込みに行ってエラーになっていると、理解しました。
それで、わざわざ、作りなおすメソッドが用意されているのねと、納得です。
コントローラーやモデルで結果を回し、自分で作り直す必要がある場合は直接回し、ただ結果をポンと直接ビューに渡したいときは、このas_array()関数を利用するという感じでしょうね。
as_array()には配列の作り方を指定する使い方もあります。
$result->as_array('id')とすれば、idをキーとし、残りの項目が配列になります。
$result_array = $result->as_array('id');
foreach($result_array as $id=>$item) {
echo 'id : ' . $id;
echo 'name : ' . $item['username'];
echo 'password : ' . $item['password'];
}
更に、キーと値にしたい項目を指定し、配列にすることも出来ます。
$result_array = $result->as_array('id', 'username');
foreach($result_array as $id => $name) {
echo 'id : ' . $id;
echo 'name : ', $name;
}
全部、確かめないで、直接今打ち込んだコードです。間違っているかも知れませんが、参考にはなるでしょう。
DBアクセスには、ある値の存在をチェックするだけの場合もあると思います。そんな時は最初にマッチした一件を取り出す、current()メソッドもあります。
$result = DB::select('title')->where('id','=', $topic_id)->from('topics')->execute()->current();
if ($result) {
return true; // 存在している
} else {
return false; // 存在していない
}
このcurrent()を利用すると、$result['title']の形で、そのまま回さなくても値が取り出せます。
あと、いまマニュアルをざっと見通して、目に入ったのは、エスケープ処理を止める方法です。サンプルを見てもらったほうが速いですね。
$result = DB::select(DB::expr('COUNT(*) as count'))->from('users')->execute();
この程度の概要ですが、この程度でどうにかなります。
whereの指定パターンとか、joinの指定、delete,update,insertなどなどはマニュアルのサンプルを御覧ください。私も、サンプルをいつも参考にしています。説明文自体は英文ですので、余り読みません。:D
追記:
NetBeans向けですが、コードテンプレート(スニペット)の記事を書きました。登録しただけで、まだ試していないコードも含んでいますが、DBのオプションの付け方など、これに含まれている内容を参考にしていただけます。DBに関していえば、メソッド名で何をするものか、大抵わかります。
設定ファイルはGithubに置いていますが、READMEに登録したコードを載せていますので、NetBeans以外の方でも、参考にしていただけると思います。
| FuelPHP、名前付きパラーメーターx2 + 404< 前 | 次 >CloudFlareで管理画面に入れなくなる |
|---|
| < 前 | 次 > |
|---|