LoginSignup
39
39

More than 5 years have passed since last update.

Qb: PHPでシンプルなクエリビルダを作った

Last updated at Posted at 2015-09-07

Qb: Simple query builder

バックエンドのAPI提供あたりを想定した、シンプルなPDOクエリビルダです。
なるべく短く書けるのを念頭に作成しました。

$rows = Qb('contact')->toJson();

これだけでcontactテーブルの一覧をJSONで返すことが出来ます。

対象ユーザー

生のPDOをそのまま使うのは面倒臭いけど、本格的なDBライブラリは機能過剰だと感じている方。

リソース

doc/index.html にリファレンスがあります。

インストール方法

qb.phpをrequireするだけでOKです。

Composerを使う場合は、

composer require naga3/qb

でインストールし、autoloadで読み込みます。

require_once 'vendor/autoload.php';

サンプル

sample/contact.php が簡単なコンタクトリストのサンプルです。
sample/todo.php がAngularJSを組み合わせたToDoリストのサンプルです。
どちらのサンプルもPDO_SQLITEモジュールが導入されていればそのまま動きます。

API

接続

Qb::connect('sqlite:sample.db');
Qb::connect('mysql:host=localhost;dbname=sample', 'user', 'pass');

指定したDSNに接続します。

SELECT

$rows = Qb('contact')->toJson();

contactテーブルの一覧をJSONで返却します。

$rows = Qb('contact')->select('name')->select('tel')->toArray();

contactテーブル一覧のname, telカラムを配列で返却します。

$rows = Qb('contact')->select(['name', 't' => 'tel'])->toObject();

contactテーブル一覧のnameカラムをそのまま、telカラムは別名tでオブジェクトとして返却します。

WHERE

$row = Qb('contact')->where('id', 1)->oneArray();

contactテーブルのidカラムが1のものを一行返却します。

$row = Qb('contact')->where(1)->oneArray(); // idカラムの場合、カラム指定を省略可能
$row = Qb('contact')->oneArray('id', 1);
$row = Qb('contact')->oneArray(1);

このような省略記法もあります。

$rows = Qb('contact')->whereGte('status', 1)->whereLike('name', '%山田%')->toJson();

contactテーブルのstatusカラムが1以上で、名前に「山田」が含まれているものを返却します。

JOIN

$rows = Qb('contact')->join('access', 'access.contact_id = contact.id')->toJson();

INNER JOINです。access.contact_id = contact.id が結合条件です。

$rows = Qb('contact')->leftJoin('access', 'access.contact_id = contact.id')->toJson();

LEFT OUTER JOINです。

INSERT

$id = Qb('contact')->save(['name' => '鈴木一郎', 'age' => 19]);

contactテーブルにnameカラムが「鈴木一郎」、ageカラムが「19」でレコードを挿入します。戻り値はプライマリキーの値です。

INSERT or UPDATE

Qb('contact')->where('age', 20)->save(['name' => '鈴木一郎', 'age' => 19]);

WHERE句がある場合はまずUPDATEを試みて、対象のレコードが無ければINSERTします。

UPDATE

Qb('contact')->where('age', 20)->update(['name' => '鈴木一郎', 'age' => 19]);

こちらは対象のレコードが無くてもINSERTされません。

Qb('contact')->where('age', 20)->update('name', '鈴木一郎');

1カラムのみの変更の場合はこのように書くことも出来ます。

SET

Qb('contact')->where('age', 20)->set('age', 19)->set('name', '鈴木一郎')->update();

setでチェーンを繋げてからINSERT, UPDATEが出来ます。

DELETE

Qb('contact')->where('age', 20)->delete();

contactテーブルのageカラムが20のレコードを全て削除します。

Qb('contact')->delete(1);

contactテーブルのidカラムが1のレコードを削除します。

ORDER BY

$rows = Qb('contact')->asc('created_at')->toJson();

contactテーブルの一覧をcreated_atカラムの昇順で返します。

$rows = Qb('contact')->desc('created_at')->toJson();

contactテーブルの一覧をcreated_atカラムの降順で返します。

OFFSET, LIMIT

$rows = Qb('contact')->offset(10)->limit(5)->toJson();

contactテーブルの一覧の10件目から5件を取得します。

PDOオブジェクト取得

$db = Qb('contact')->db();

生のPDOオブジェクトを取得します。トランザクションを張る場合などにどうぞ。

接続時のオプション

$options = [
  // プライマリキー
  'primary_key' => 'id',
  // ERRMODE
  'error_mode' => PDO::ERRMODE_EXCEPTION,
  // json_encode時のオプション
  'json_options' => JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_AMP | JSON_HEX_QUOT,
];
Qb::connect($dsn, $user, $pass, $options);

注意点

  • 1プログラム1接続が前提で、大規模なプログラムには向いていません。
39
39
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
39
39