Download the PHP package haikara/sequel-builder without Composer
On this page you can find all versions of the php package haikara/sequel-builder. It is possible to download/install these versions without Composer. Possible dependencies are resolved automatically.
Informations about the package sequel-builder
sequel-builder
SQL文の組み立てをおこなうライブラリ。
プレースホルダーを含むSQL文を組み立て、埋め込む値を保持する。
SQLの文法に近い書き心地を目標とする。
利用方法
以下のサンプルではPHP8.0以上を前提とする。
ビルダーのインスタンス化と、SQL文の取得
基本クラスとして、Select、Insert、Update、Deleteが存在する。
いずれもBuilderクラスを継承しており、以下のように用いる。
カラムの指定
SELECT文で取得するカラムを指定したい場合、columnsメソッドに可変長引数で指定する。
WHERE
WHERE句による絞り込みは、whereメソッドにcallableな値を渡す形で記述する。
callable値の実行、引数にRulesクラスのインスタンスが渡されるので、必要なメソッドを呼び出したうえでreturnする。
Rulesクラスに備わるメソッドは様々なので、以下では簡易な例を紹介する。
テーブルの結合
LEFT JOINなど、テーブル結合の記述。
ON句での結合条件の記述は、WHEREと同じくcallableとRulesクラスを用いる。
GROUP BYとHAVING
HAVINGの使い方はWHEREとまったく同じになる。
ORDER BY
LIMITとOFFSET
limitメソッドとoffsetメソッドがあり、別々に指定できるが、
OFFSET値は、limitの第二引数にまとめて渡すこともできる。
ページング
ページネーションに必要なLIMITとOFFSETの値を算出して指定する。
全件数のカウント
MySQLのFOUND_ROWS関数は非推奨になったので、COUNT関数を用いて全件数を取得する必要があるが、
レコードを取得するするSQLと全件数を取得するSQLは、似たような記述ではあるものの共通化が手間なので、
手軽に全件数を取得するSQLを組み立てる方法としてSelect::buildFoundRows
を用意している。
Rulesクラスの詳細
whereメソッドなどで用いるRulesクラスのメソッドを詳しく紹介する。
条件分岐
whenメソッドで条件分岐を記述できる。これはSQLの構文ではなく、
PHPのif文によって動的に検索条件を組み変える際の、より良い代替手段として用意されている。
whenの第一引数に条件式(bool値)を渡し、第二引数にcallableを渡す。
OR
Rulesクラスの同じオブジェクトに対して指定した条件は、すべて並列にANDで繋がれる。
ORを書きたい場合は、anyメソッドを用いて、別のRulesオブジェクトに指定する形になる。Rulesのネスト。
INとサブクエリ
サブクエリ
サブクエリが静的なSQLなら文字列で記述しても問題ない。
値のバインドを伴う動的なSQLではSQL::selectを使う必要がある。
WHERE ... INにサブクエリを用いる
inメソッドの第二引数に配列ではなくSelectクラスのオブジェクトを渡すことで、サブクエリを用いた絞り込みができる。
比較にサブクエリを用いる
サブクエリの結果を値の比較に用いる。
テーブル結合にサブクエリを用いる
カラム指定にサブクエリを用いる
CASE文
下記のようなクエリの組み立てを想定する。
CaseStatementを用いてCASE文を記述する例
ビルダーの機能だけで組み立てるので安全だが、可読性に難がある。
プレースホルダを含むCASE文の文字列を渡すパターン
INSERT
通常のINSERT文
ON DUPLICATE KEY UPDATE
ユニークキーなどの制約に引っかかることでINSERTに失敗したら、代わりにUPDATEを実行したい場合がある。
SELECTで存在チェックをしてPHP側で条件分岐を書いてもいいが、ON DUPLICATE KEY UPDATEを用いる方法もある。
これにより「あればINSERT,なければUPDATE」の動きを、ひとつのSQLで済ませることができる。
多対多の中間テーブルに対して繰り返し登録・更新をおこなうような処理で役に立つかもしれない。
BULK INSERT
Insert::valuesを続けて呼び出すことで、複数のレコードを一括登録できる。
UPDATE
UPDATEの条件はSELECTと同様、whereメソッドを呼び出すことで記述する。
DELETE
DELETEの条件もwhereメソッドにcallableを渡し、Rulesクラスを用いる。
All versions of sequel-builder with dependencies
ext-mbstring Version *