perlのSQL::MakerをPHPに移植してみた

memememomo/php-SQL-Maker - GitHub


PHPでもSQL::Makerを使いたいなーとか、
PHPUnit使ってみたいなーとか、
PHPの練習にいいかなーとか思ったので作りました。


プラグインなどの一部の機能はまだ実装はできておりませんが、基本的なSQLを生成できるようになっています。


使い方は以下のような感じです。

インスタンスの作成
$builder = new SQL_Maker(array('driver' => 'SQLite'));

driverオプションにDBのタイプを指定します。現在は「mysql」「SQLite」「Oracle」が選択できます。

select()
// テーブル名
$table = 'pokedex';

// フィールド
$fields = array('id', 'name');

// WHERE句
$where = array();
$where['area'] = 'houen';
$where['type'] = array( 'like' => '%electric%' );

// オプション
$opt = array();
$opt['order_by'] = array('id');


// SQL生成
list($sql, $binds) =
    $builder->select($table, $fields, $where, $opt);

/*
 * $sql   => "SELECT id, name
 *            FROM pokedex
 *            WHERE (area = ?) AND (type LIKE ?)
 *            ORDER BY id"
 * $binds => ("houen", "%electric%")
 */
WHERE句
// テーブル名
$table  = 'pokedex';

// フィールド
$fields = array('*');

// WHERE句
$where  = array(
               'name'      => 'Pikachu',
               'legendry'  => null,
               'area'      => array('ish', 'joto'),
               'base_hp'   => array('<=' => 40),
               'type'      => array('like' => '%electric%'),
               'id'        => SQL_Maker::scalar( array('= (? - 0)', 25) ),
               'available' => SQL_Maker::scalar( array('LIKE ? ESCAPE ?', '%mega\\_kick%', '\\') )
               );

// SQL生成
list($sql, $binds) = $builder->select($table, $fields, $where);

/*
 * WHERE ( name = "Pikachu" ) AND
 *       ( legendry IS NULL ) AND
 *       ( area IN ("ish", "joto") ) AND
 *       ( base_hp <= 40 ) AND
 *       ( type LIKE "%electric%" ) AND
 *       ( id = (25 - 0) ) AND
 *       ( available LIKE "%mega\_kick%" ESCAPE "\" );
 */


array()やSQL_Maker::scalar()などを使うと、割と複雑なWHERE句が生成できます。
その他の例は、「SQL/Maker/Condition.php」に書いてあります。


perlスカラーリファレンスの代わりに、独自のSQL_Maker::scalar()を使っているのが、あまり気に入ってません。どうすれば良いのだろ。

delete()
list($sql, $binds) = $builder->delete('pokedex', array( 'id' => '25' ));


/*
 * $sql    => "DELETE FROM pokedex WHERE (id = ?)"
 * $binds  => (25)
 */
insert()
// テーブル名
$table = 'pokedex';

// VALUES
$values = array(
                'id' => 25,
                'name' => 'Pikachu'
                );

// SQL生成
list($sql, $binds) = $builder->insert($table, $values);


/*
 * $sql   => "INSERT INTO pokedex (name, id) VALUES (?, ?)"
 * $binds => ("Pikachu", 25)
 */
update()
// テーブル名
$table = 'pokedex';

// データ
$set   = array('type' => 'electric');

// WHERE句
$where = array('id' => 25);

// SQL生成
list($sql, $binds) = $builder->update($table, $set, $where);

/*
 * $sql   => "UPDATE pokedex SET type = ? WHERE (id = ?)"
 * $binds => ("electric", 25)
 */

メソッドチェーン

$sql = new SQL_Maker_Select();

$sql
->addSelect('foo')
->addSelect('bar')
->addSelect('baz')
->addFrom('table_name')
->asSql();

// => "SELECT foo, bar, baz FROM table_name"

参考

tokuhirom/SQL-Maker - GitHub
元のモジュールです。perlを書いているときに愛用しています。


Perl CPANモジュールガイド

Perl CPANモジュールガイド


プログラム例で参考にさせていただきました。