PHPのSQLビルダライブラリFluentPDOを試してみた。
試してみようと思った動機
いままで文字列操作でSQLを組み立ててたけど、
検索条件によってSQLを組み立てるときにスペースやコンマが抜けててシンタックスエラーになったり、
$sql = 'select * from foo';
if ($condition) {
$sql = 'where column = ?';
// whereの前にスペースがなくてエラー!
}
IN句の組み立てがつらかったりした。
$values = ['val1', 'val2', 'val3'];
$sql = 'select * from foo where column in (' . implode(',', array_fill(0, count($values), '?')) . ')';
// つらい!
世の中にはSQLビルダとかいう便利なものがあるらしいので、調べてみた。
SQLビルダに求めるもの
- シンプルなシンタックス
- DBアクセスは外部から設定できること
いろいろ見た結果FluentPDOが要件を満たしていた。
使い方
公式ドキュメントに詳しく書かれているのでそちらを見るのが早いけど、こんな感じで使える。
$pdo = new PDO("mysql:dbname=fblog", "root", "password");
$fpdo = new FluentPDO($pdo);
$query = $fpdo->from('article')
->where('published_at > ?', $date)
->orderBy('published_at DESC')
->limit(5);
if ($user_id) {
$query = $query->where('user_id', $user_id);
}
foreach ($query as $row) {
echo "$row[title]\n";
}
FluentPDOのいいところ
- DBアクセスをPDOに任せている
- ライブラリ自体はSQLの組み立てに専念しているため、シンプルな構成になっている
- 呼び出し側のコードがシンプル
FluentPDOのよくないところ
PHP 5.1から対応してるので、コードベースが古い。
なのでforkしていじってみた。
- PSR準拠
- namespace化、autoload対応
- short array syntax使用
まとめ
やり過ぎない感じで良いライブラリだと感じた。
今度実戦投入してみようと思う。