PQ

PHP でデータベースを利用するちょっとしたアプリケーションを作るにあたって、手軽に DB を操作できると良いなと思ってます。この辺も自分で作ってみようかなと思い立ち、まずはインタフェースを固めるべくそのプロトタイプを作ってみました。

$pq = new PQ();
$pq->dsn('mysqli://nobody:nobody@localhost/sample?charset=utf8');

echo $pq->query('users')
    ->where( array('age'  => array('>' => 20)) )
    ->where( array('mail' => array('-like' => '%@example.com')) )
    ->fields("mail, name")
    ->order("updated desc")
    ->offset(0)
    ->limit(10)
    ->exec()
    ->map(function ($o) { return $o[0]; })
    ->map(function ($v) { return strtoupper($v); })
    ->join("\n") . "\n";

と書けますと。実行すると、users テーブルに "SELECT mail, name FROM users WHERE age > ? AND mail LIKE ? ORDER BY updated desc LIMIT 0,10" というクエリが発行されて

% php pq.php
PIYO@EXAMPLE.COM
FOOBAR@EXAMPLE.COM

と出力されます。

SQL をメソッドチェインで組み立てて実行し、戻ってきたリストを先日作った List_RubyLike で返却することによりさらにその先もメソッドチェインで処理していくという類のコンセプトになっています。重厚な大規模開発向けというわけではなく、あくまでちょっとした処理を手軽に行いたいときに、というもの。

まだ適当にでっちあげたラフコード、言ってみれば漫画でいうところのネーム的なコードなのですが、実際に動きはします。

これから DSN の設定周り、CRUD、DB から返却されたレコードをオブジェクトにマッピングするところなどを作り込んでいって、使えるところまで持っていきたいなと思っています。PHPにまだ慣れないもので進捗は芳しくないですが、その辺はご勘弁を。

ところで、このインタフェースをみると Rails 3 の Arel 的な動きをして欲しいところもありますが、まずはミニマムスタートということでお茶を濁しましょう・・・。誰か PHP に Arel 移植してくれないかなー(笑)

なお、SQL 組み立て部分は、id:fbis さん作成の SQL_Abstract を利用しています。