dietcake advent calendar 2014 の8日目です。
dietcakeを使ってデータベースアクセスを行いたい場合、dietcake自身はDBアクセス機能を持っていないので、
自分に相応しいライブラリを選択して使う事になります。
Propel でも Doctrine でもなんでもいいんですが、結局の所、突き詰めると生SQL書かないといけなくなるか、
SQLに関する知識が必要になるので、SQLそのまま書いた方が考える事が減って効率良いです。
dietcake と一緒に公開されている SimpleDBI は、SQLを実行するためのシンプルなライブラリなので、
これを使って作られたサンプル、dietcake-message-board を元に簡単に使い方を紹介します。

SimpleDBIを用意する

dietcake-message-boardはvendorディレクトリに同梱されていますが、spongecakeのようにcomposer経由でインストールのが手っ取り早いです。
composer経由でインストールした場合はcomposerのautoloadで自動的にロードされますが、vendorディレクトリに手で放り込んだ場合は app/config/bootstrap.php 内でロードしてください。

DBクラスを作る

SimpleDBIは、ライブラリだけで動作させる事はあまり考慮されていなくて、SimpleDBIを継承したDBクラスを作り、
そこに接続設定やロギングに関する設定を記述する設計になっています。

DBクラスを作って継承する形にする事で、シャーディングに対応したり、クエリキャッシュを自前実装したりできるのですが、
シンプルな接続を行なう形になっているので app/config/database.php のようになっています。

DB接続設定をcore.phpに記述する

先ほど作ったデータベースにある、getConnectSettings() メソッドが、DBへの接続設定を返すメソッドなのですが、実装を見てもらうとわかるように、接続先名は定数化されています。この定数の値を core.php に記述する事で、DBクラスが動作するようになります。

<?php
define('DB_DSN', 'mysql:host=localhost;dbname=board');
define('DB_USERNAME', 'board_root');
define('DB_PASSWORD', 'board_root');
define('DB_ATTR_TIMEOUT', 3);

SQLクエリを投げる

SQLを実行し、その結果を受け取るには、まずDB::conn()メソッドを実行して、DBインスタンスを取得したあと、
DBインスタンスが持つメソッドを利用する事で実現できます。
以下は、SQLの実行結果を一行取得して配列で返すrow()を利用して、$idで指定した行を取得するコードです。

<?php
$db = DB::conn();
$row = $db->row('SELECT * FROM thread WHERE id = ?', array($id));

取得系は単一行取得の row() 、複数行の rows() 、単一の値を取得する value()があります。第二引数に配列を指定する事で
クエリ側のプレースホルダに値を代入する事ができます。外部から受け取った値を使う場合は必ずプレースホルダを使いましょう。

書き込み系は、insert()、replace()、update()などがあります。これらのメソッドでカバーしきれない部分についてはquery()を使うとよいでしょう。

DB処理を行なう上で守るべきルール

SimpleDBIは、DBインスタンスを DB::conn() で取得できるので、どこでもDBインスタンスを作り出してDB処理を行なう事ができます。
しかし、MVCのルールに従うのであれば、DB処理は必ずモデルの中だけで行なうべきです。
よくあるDBと密接に結びついたORMを利用すると、DB処理とモデルのメソッドの境界が曖昧になり、
controllerの上でSELECT発行したり、トランザクションを貼ったりしますが、Controllerの役割は「外部のリクエストを受け取り、Modelを呼び出し、その結果をViewに返す」ですので注意しましょう。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

ねこ認証:9つのパネルの中からねこを3匹選んでください