BambooはPine Frameworkを構成する強力なORマッパーです。この章ではBambooの仕様を公開します。Bambooを用いる事で、どれほどデータベースアクセスが簡単になるかご理解いただけるでしょう。

※この記事は執筆・公開から1年以上経過しています。記事の情報が古くなっている場合がありますのでご注意ください。

公開日時:2019/12/07 23:14 最終更新:2021/06/09 21:55   Pine Framework

Bamboo リファレンスマニュアル

導入

Bambooはシングルトン・デザインパターンで構成されたDataMapper型のORマッパーです。

DBテーブルのエンティティは型付きのフィールドを持つDataModelで表現されますが、このDataModelを利用する事で、INSERTやUPDATEといったDMLは驚くほど簡単に実行できます。

DataModelを使ったINSERT処理の例
$u              = new \pine\bamboo\User();
$u->user_id     = "pine_user";
$u->user_name   = "Katsuhiko Miki";
$u->prefecture  = "Nagano";
$u->city        = "Nagano";
$u->gender      = "Male";

$this->bamboo->setup("User")->insert($u)->execute();

また、Bambooは高度で柔軟なクエリビルダを搭載しており、

  1. Selectオブジェクトを利用する抽象化された簡易なSELECT文の発行
  2. SQLを直接書いていくような手続き型のクエリ・ビルディング
  3. 生SQL文の実行

まで、開発現場の幅広い要求に対応できるよう設計されています。

特に、手続き型のクエリビルディングではチェーン・メソッドを利用し、抽象化されたSQLを書き綴るような感覚でクエリを構築し実行することが可能です。

チェーンメソッドを使ったSELECTクエリ発行処理の例
$this->bamboo->setup("User")
        ->select("*")
        ->where(["user_id", "pine_user"])
        ->orderBy(["upd_at", \pine\bamboo\OrderBy::DESC])
        ->execute();

Bambooのクラス設計

NameSpace

\pine\bamboo

定数

\pine\bamboo\RESULT_ONE             "result_one"
\pine\bamboo\RESULT_ONE_OR_NONE     "result_one_or_none"
\pine\bamboo\MODIFY_ONE             "modify_one"

Public methods

特殊メソッド

public static function getInstance() : \pine\bamboo\Bamboo

Bambooの単一のインスタンスを返す。

基本設定メソッド

public function db(DB $db) : \pine\bamboo\Bamboo

利用するデータベースへ接続を行い、Bambooインスタンス内にPDOインスタンスを保持する。

【Bambooの基本的なイニシャライズ方法】
$db     = \pine\bamboo\Database::getDB();
$bamboo = \pine\bamboo\Bamboo::getInstance()->db($db);

上記は、Bambooでデータベースを利用する際の基本的なイニシャライズ方法です。

Databaseクラスはsites/[site_id]/assets/environments/Database.phpにあり、getDB()メソッドは、データベースの環境設定を定義した\pine\bamboo\DBオブジェクトを返却しています。

Bambooはシングルトンパターンで設計されているため、getInsrance()メソッドを実行すると初回はnewされたBambooオブジェクトへの参照が返され、2回目移行は初回にnewされたオブジェクトへの参照が再び返されます。

このBambooオブジェクトに対してdb()メソッドを実行する事で、指定されたデータベーススキーマへの接続が行われます。

このデータベーススキーマへの接続はBambooを構成するデータベース接続用クラス\pine\bamboo\DBConnectを介して行われますが、DBConnectもシングルトンパターンで設計されており、1つのDBオブジェクトを元にしたデータベーススキーマへの接続ハンドルはDBConnectオブジェクト内に保持され2回目以降の接続呼び出しの際にも使い回されます。

つまり、複数のDBオブジェクトを用いてDBConnectで接続要求を行った場合、そのDBオブジェクトの種類の数だけ接続ハンドルが生成されてDBConnectオブジェクト内に保持されるため、

$bamboo = \pine\bamboo\Bamboo::getInstance()->db($db1);
$bamboo = \pine\bamboo\Bamboo::getInstance()->db($db2);
$bamboo = \pine\bamboo\Bamboo::getInstance()->db($db3);

のように、Bambooのdb()メソッドに渡すDBオブジェクトを変えることで、Bambooで利用するデータベース接続ハンドルを選択的に切り替えて処理を行う事が可能です。

この接続を識別するIDは、

$db_id  = $db->dbname . ":" . $db->dbhost . ":" . $db->port;

となっていて、DSN文字列がそのまま接続ハンドル識別用のIDとなります。

なお、DBConnectに対する接続要求は、

$db     = \pine\bamboo\Database::getDB();
$con    = \pine\bamboo\DBConnect::getInstance()->getPDO($db);

として接続ハンドルを取得する事ができます。

その他
public function clear() : \pine\bamboo\Bamboo

Bambooに設定されている情報を初期化する。

public function setup(string $datamodel) : \pine\bamboo\Bamboo

一連の処理で利用するDataModel名と利用するテーブル名を設定する。

テーブル名は英語の標準的なルールに従いDataModelの複数形が設定される。

public function setupAsIs(string $datamodel) : \pine\bamboo\Bamboo

一連の処理で利用するDataModel名と利用するテーブル名を設定する。

テーブル名はDataModelと同じ名称が設定される。

public function table(string $tablename) : \pine\bamboo\Bamboo

一連の処理で利用するテーブル名を設定する。DataModel名に依存しないテーブル名を指定したい場合に使用する。

public function model(string $datamodel) : \pine\bamboo\Bamboo

一連の処理で利用するDataModel名を設定する。

動作モード設定メソッド

public function strict() : \pine\bamboo\Bamboo

SELECTの際に、結果をDataModelにマッピングする。デフォルト

public function loose() : \pine\bamboo\Bamboo

SELECTの際に、結果を\stdClassにマッピングする。

主にJOINを行ったり、集約関数を用いる場合など、個別にDataModelを作成するのが非効率な場合に用いる。

また、DataModelはそのままではjson_encode()出来ないため、結果セットをJSONエンコードしてブラウザにレスポンスとして返却する場合などに用いる場合もある。

public function live() : \pine\bamboo\Bamboo

SELECTの際に、deletedフラグが0のレコードのみを取得する。デフォルト

public function deleted() : \pine\bamboo\Bamboo

SELECTの際に、deletedフラグが1のレコードのみを取得する。

public function all() : \pine\bamboo\Bamboo

SELECTの際に、deletedフラグによる絞り込みを行わない。

public function raw() : \pine\bamboo\Bamboo

INSERT及びUPDATEの際に、システムで制御されているadd_*、upd_*、deletedカラムについてもDataModelの情報の通りに操作を行う。

public function managed() : \pine\bamboo\Bamboo

INSERT及びUPDATEの際に、システムで制御されているadd_*、upd_*、deletedカラムについてDataModelの情報を無視する。デフォルト

アサーションメソッド
public function assert(string $mode) : \pine\bamboo\Bamboo

DML実行後に指定のモードでクエリ結果の検査を行うように設定する。

モード アサート内容
\pine\bamboo\Bamboo::MODIFY_ONE 挿入または更新、削除されたレコードが1件のみか?
\pine\bamboo\Bamboo::RESULT_ONE 選択されたレコードが1件のみか?
\pine\bamboo\Bamboo::RESULT_ONE_OR_NONE 選択されたレコードが1件のみ、または1件も選択されなかったか?
public function assertResultOne($result): bool

渡された結果セットについて、レコード数が1件であるか検査し、不適合の場合は\pine\bamboo\DBResultExceptionをthrowする。

public function assertResultOneOrNone($result): bool

渡された結果セットについて、レコード数が1件または0件であるか検査し、不適合の場合は\pine\bamboo\DBResultExceptionをthrowする。

ゲッター

public function getQuery(bool $should_terminate = true) : string

現在組み立てられているクエリを返す。

public function getLogQuery() : string

現在組み立てられているログ記録用クエリを返す。

public function reform() : \pine\bamboo\Bamboo

組み立てられているクエリを整形する。

public function reformLast() : \pine\bamboo\Bamboo

組み立てられている最後のクエリを整形する。

public function getBind() : array

現在セットされていバインドパラメタセットを返す。

public function getData() : array

現在セットされているDataModelセットを返す。

public function getLastQuery(bool $should_reform = false) : string

最後に実行されたクエリを返す。

public function getLastBind()

最後に利用されたバインドパラメターセットを返す。

public function getLastData()

最後に利用されたDataModelセットを返す。

public function getMode() : string

現在セットされているクエリ実行モード(SELECT、INSERT、UPDATE等)を返す。

public function getPDO() : \PDO

現在セットされているPDOインスタンスを返す。

public function getDriver() : string

現在セットされているデータベース情報を返す。

トランザクションメソッド

public function transaction(string $action) : \pine\bamboo\Bamboo

トランザクションを操作する。

アクション 動作内容
\pine\bamboo\BEGIN トランザクションを開始する。
\pine\bamboo\COMMIT トランザクションをコミットする。
\pine\bamboo\ROLLBACK トランザクションをロールバックする。

INSERT ID取得メソッド

public function getLastInsertIdList(): array

最後に実行された一連のINSERT処理で生成されたレコードのIDのリストを返す。

public function getLastInsertId(): int

最後にINSERTで生成されたレコードのIDを返す

DDLメソッド

※この項のメソッドは通常bambooコマンドを利用して定義ファイルから自動実行されます。このため、ドキュメントはまだ準備されません。

public function createTable(DB $db, TableSetting $settings) : \pine\bamboo\Bamboo

CREATE TABLE文を生成する。

public function dropTable() : \pine\bamboo\Bamboo

DROP TABLE文を生成する。

public function truncate() : \pine\bamboo\Bamboo

TRUNCATE文を生成する。

public function createView(string $view_name = null, $columns = null) : \pine\bamboo\Bamboo

CREATE VIEW文を生成する。

public function dropView(string $view_name = null) : \pine\bamboo\Bamboo

DROP VIEW文を生成する。

public function getStructures(string $table_name) : array

テーブル構造情報を取得する。

public function getConstraints(string $table_name) : array

テーブルの制約情報を取得する。(PostgreSQLのみ)

public function getIndexes(string $table_name) : array

テーブルのインデックス情報を取得する。

クエリ構築用メソッド

■bind()
public function bind(array $binds) : \pine\bamboo\Bamboo

バインドパラメタセットを設定する。

■inject()
public function inject(array $injects) : \pine\bamboo\Bamboo

埋め込みパラメタセットを設定する。

Bambooでのクエリを構築する際、与えられたstringは全て適切にエスケープされる。このため、クエリ文字列内にシングルクオートが必要な記述がある場合、これがエスケープされてSyntax Errorとなる。

inject()メソッドは上記のエスケープ処理を回避し、エスケープ後のクエリに対して、シングルクオートを含むクエリ文字列の埋め込みを行う。

なお、inject()用のプレースホルダは(:任意の文字列)を利用する。

●inject()の使用例
$result = $this->bamboo->setUp("AccessLog")
            ->loose()
            ->select("*, (:timestamp)")
            ->inject(["timestamp" => "DATE_FORMAT(add_at, '%y/%m/%d %H:%i:%s') AS timestamp"])
            ->where(
                        ["date", [date("Y-m-d"), date("Y-m-d", strtotime("-1 day"))], bamboo\Where::IN],
                        ["site_id", "pub"]
                    )
            ->orderBy(["add_at", bamboo\OrderBy::DESC])
            ->execute();
■query()
public function query(string $query) : \pine\bamboo\Bamboo

生クエリを設定する。

●query()実行例

```

$qry    = <<< EOL
SELECT  * 
FROM    users 
WHERE   user_id = :user_id 
AND     prefecture = :prefecture 
EOL;

$params     = ["user_id" =>  $_GET["user_id"], "prefecture" =>  $_GET["prefecture"]];

$this->bamboo->setUp("User")->query($qry)->bind($prams)->execute();
■rowCount()
public function rowCount() : \pine\bamboo\Bamboo

SELECT COUNT(*) モードに設定する。

■select()
public function select($select = null) : \pine\bamboo\Bamboo

SELECT文のexpressionを生成する。

$selectにstringが渡された場合はそのままexpressionとして生成する。(文字列はエスケープされます)

$selectにSelectオブジェクトが渡された場合はオブジェクトに従ってSELECT文を生成する。

$selectにarrayが渡された場合は配列の各要素に従って再帰的に処理する。

$selectにnullが渡された場合はSELECT * を生成する。

●基本的な直接値渡しでのselect()実行例
$this->bamboo->setup("User")->select("user_id, prefecture, city");
生成されるSQL
SELECT `user_id`, `prefecture`, `city` FROM `users`
●Selectオブジェクトを利用したselect()実行例
$where              = new \pine\bamboo\Where(["col_a", 1], ["col_b", 2]);
$order_by           = new \pine\bamboo\OrderBy(["col_a", "asc"], ["col_b", "desc"]);
$group_by           = new \pine\bamboo\GroupBy(["col_a", "col_b"]);
$group_by->having   = new \pine\bamboo\Having(["col_a", 1], ["col_b", 2]);
$limit              = new \pine\bamboo\Limit(5, 3);

$select             = new \pine\bamboo\Select(null, "col_a, col_b", "test_a", $where, $group_by, $order_by, $limit, true);

$this->bamboo->select($select);
生成されるSQL
SELECT `col_a`, `col_b` FROM `test_a`
WHERE `col_a` = :col_a_0 AND `col_b` = :col_b_1 AND `lg_del` = 0
GROUP BY `col_a`, `col_b` HAVING `col_a` = :col_a_2 AND `col_b` = :col_b_3
ORDER BY `col_a` ASC, `col_b` DESC
LIMIT 5 OFFSET 3
FOR UPDATE
■selectView()
public function selectView($select) : \pine\bamboo\Bamboo

ヴューからSELECTを行うように動作モードを設定する

■from()
public function from($from = null, $alias = null) : \pine\bamboo\Bamboo

FROM句を生成する。

■join()、on()、using()
public function join($type, $join, $alias = null) : \pine\bamboo\Bamboo

JOIN句を生成する。

public function on() : \pine\bamboo\Bamboo

ON句を生成する。

public function using($using) : \pine\bamboo\Bamboo

USING句を生成する。(MySQL、MariaDBのみ)

●join()の実行例
$this->bamboo->loose()->select("U.*, F.favorite")
->from("users", "U")
->join("LEFT", "favorites", "F")
->on(["U.user_id", "F.user_id"]);
生成されるSQL
SELECT      `U`.*, `F`.`favorite` 
FROM        `users` AS `U` 
LEFT JOIN   `favorites` AS `F` 
ON          `U`.`user_id` = `F`.`user_id` 
■where()
public function where() : \pine\bamboo\Bamboo

WHERE句を生成する。

●直接値渡しでのwhere()実行例
$this->bamboo->setUp("User")->select("*")
->where(["user_id", "pine_user"], ["upd_at", "2019-12-06 00:00:00", \pine\bamboo\Where::GRATERLEFT]);
生成されるSQL
SELECT  *
FROM    users
WHERE   user_id = :user_id
AND     upd_at > :upd_at
●Whereオブジェクトでのwhere()実行例
$where  = new \pine\bamboo\Where();
$where->add(["user_id", "pine_user"]);
$where->add(["upd_at", "2019-12-06 00:00:00", \pine\bamboo\Where::GRATERLEFT]);

$this->bamboo->setUp("User")->select("*")->where($where);
生成されるSQL
SELECT  *
FROM    users
WHERE   user_id = :user_id
AND     upd_at > :upd_at
■groupBy()
public function groupBy() : \pine\bamboo\Bamboo

GROUP BY句を生成する。

●直接値渡しでのgroupBy()実行例
$this->bamboo->setUp("User")->select("*")->groupBy(["prefecture", "city"]);
生成されるSQL
SELECT      *
FROM        users
GROUP BY    `prefecture`,  `city`
●GroupByオブジェクトでのgroupBy()実行例
$group_by   = new \pine\bamboo\GroupBy(["prefecture", "city"]);

$this->bamboo->setUp("User")->select("*")->groupBy($group_by);
生成されるSQL
SELECT      *
FROM        users
GROUP BY    `prefecture`,  `city`
■orderBy()
public function orderBy() : \pine\bamboo\Bamboo

ORDER BY句を生成する。

●直接値渡しでのorderBy()実行例
$this->bamboo->setUp("User")->select("*")
->orderBy(["prefecture", \pine\bamboo\OrderBy::ASC], ["city", \pine\bamboo\OrderBy::DESC]);
生成されるSQL
SELECT      *
FROM        users
ORDER BY    `prefecture` ASC,  `city` DESC
●OrderByオブジェクトでのorderBy()実行例
$order_by   = new \pine\bamboo\OrderBy();
$order_by->add(["prefecture", \pine\bamboo\OrderBy::ASC]);
$order_by->add(["city", \pine\bamboo\OrderBy::DESC]);
$this->bamboo->setUp("User")->select("*")->orderBy($order_by);
生成されるSQL
SELECT      *
FROM        users
ORDER BY    `prefecture` ASC,  `city` DESC
■limit()
public function limit() : \pine\bamboo\Bamboo

LIMIT句を生成する。

●直接値渡しでのlimit()実行例
$this->bamboo->setUp("User")->select("*")->limit(5, 3);
生成されるSQL
SELECT  *
FROM    users
LIMIT 5 OFFSET 3
●Limitオブジェクトでのlimit()実行例
$limit  = new \pine\bamboo\Limit(3, 5);

$this->bamboo->setUp("User")->select("*")->limit($limit);
生成されるSQL
SELECT  *
FROM    users
LIMIT 5 OFFSET 3
lock()
public function lock(bool $lock = true) : \pine\bamboo\Bamboo

楽観排他を行うため、SELECT FOR UPDATE句を生成する。

■union()
public function union($type = null) : \pine\bamboo\Bamboo

UNION句を生成する。

●union()実行例
$this->object->setUp("Test")
->select("*")->from("test1")
->union()
->select("*")->from("test2");
生成されるSQL
SELECT * FROM `test1`
UNION
SELECT * FROM `test2`
●union()実行例(UNION ALL)
$this->object->setUp("Test")
->select("*")->from("test1")
->union("ALL")
->select("*")->from("test2");
生成されるSQL
SELECT * FROM `test1`
UNION ALL
SELECT * FROM `test2`
■terminate()
public function terminate() : \pine\bamboo\Bamboo

クエリビルディングを現在の状態で確定させる。

Bambooでは暗黙的なクエリビルディングが導入されているため、setup()等で使用するDataModelが指定された段階でデフォルトの操作対象テーブルが決まる。このため、from()メソッドで明示的にソーステーブル名を指定しなくとも、where()が実行された段階で自動的にFROM句が生成される。

ただし、select()を実行した段階ではまだFROM句は生成されないため、この時点で構築されているクエリを取得する場合にはterminate()メソッドをコールしてクエリを確定させる。

なお、getQuery()メソッドを用いて構築されているクエリを取得する際にはgetQuery()メソッド内でterminate()がコールされているため、実装者が個別にterminate()を実行する必要はなく、同様にexecute()を実行した場合にも内部でterminate()がコールされるため実装者が個別にterminate()を実行する必要はない。

CUDメソッド

■upsert()
public function upsert($data) : \pine\bamboo\Bamboo

Bamboo を UPSERT モードに設定し、クエリを生成する。

■upsert()の使用例

DataModelのプライマリキーでWhere句を生成してSELECTし、レコードが存在する場合はUPDATE、存在しない場合はINSERTする。

$u              = new \pine\bamboo\User();
$u->user_id     = "pine_user";
$u->user_name   = "Katsuhiko Miki";
$u->prefecture  = "Nagano";
$u->city        = "Nagano";
$u->gender      = "Male";

$this->bamboo->upsert($u)->execute();
■insert()
public function insert($data) : \pine\bamboo\Bamboo

Bamboo を INSERT モードに設定し、クエリを生成する。

●insert()の使用例
$u              = new \pine\bamboo\User();
$u->user_id     = "pine_user";
$u->user_name   = "Katsuhiko Miki";
$u->prefecture  = "Nagano";
$u->city        = "Nagano";
$u->gender      = "Male";

$this->bamboo->insert($u)->execute();
■update()
public function update($data, $logical_delete = false) : \pine\bamboo\Bamboo

Bamboo を UPDATEモードに設定し、クエリを生成する。 DataModelのprimaryキーによりWHERE句が生成される。

●update()の使用例
$u              = new \pine\bamboo\User();
$u->user_id     = "pine_user";
$u->user_name   = "Katsuhiko Miki";
$u->prefecture  = "Nagano";
$u->city        = "Nagano";
$u->gender      = "Male";

$this->bamboo->update($u)->execute();
■updateByWhere()
public function updateByWhere($data, \pine\bamboo\Where $where, bool $logical_delete = false) : \pine\bamboo\Bamboo

BambooをWhereオブジェトを使ったUPDATEモードに設定し、クエリを生成する。WHERE句はWhereオブジェクトにより生成される。

●updateByWhere()の使用例
$u              = new \pine\bamboo\User();
$u->user_name   = "unknown";

$where          = new \pine\bamboo\Where(["upd_at", "2019-12-06 00:00:00", \pine\bamboo\Where::ABOVELEFT])

$this->bamboo->updateByWhere($u, $where)->execute();
■delete()
public function delete($data, bool $physical = false) : \pine\bamboo\Bamboo

BambooをDELETEモードに設定し、クエリを生成する。

DataModelのprimaryキーによりWHERE句が生成される。

$physicalフラグがfalseの場合は物理削除は行わず、update()メソッドを呼び出しdeletedフラグを1に更新する。

●delete()の使用例

プライマリキーでの削除。

デフォルトでは論理削除となりupdate()が呼ばれてdeletedフラグが1に更新される。第2引数にtrueを指定すると論理削除となり、DELETE文が発行される。

$u              = new \pine\bamboo\User();
$u->user_id     = "pine_user";
$this->bamboo->delete($u)->execute();
■deleteByWhere()
public function deleteByWhere() : \pine\bamboo\Bamboo

BambooをWhereオブジェトを使ったDELETEモードに設定し、クエリを生成する。

WHERE句はWhereオブジェクトにより生成される。

デフォルトでは論理削除となりupdate()が呼ばれてdeletedフラグが1に更新される。第2引数にtrueを指定すると物理削除となり、DELETE文が発行される。

●deleteByWhere()の使用例
$where  = new \pine\bamboo\Where(["upd_at", "2019-12-06 00:00:00", \pine\bamboo\Where::ABOVELEFT]);

$this->bamboo->deleteByWhere($where)->execute();

クエリ実行メソッド

■execute()
public function execute(bool $clean_up = true)

組み立てられているクエリを実行する。

assert()メソッドで結果検査が予約されている場合はクエリ実行後に検査を行い、不適合の場合は\pine\bamboo\DBResultExceptionをthrowする。

Whereオブジェクト

NameSpace

\pine\bamboo

定数

\pine\bamboo\Where::LIKE            "LIKE"
\pine\bamboo\Where::LIKE            "LIKE%"
\pine\bamboo\Where::_LIKE           "%LIKE"
\pine\bamboo\Where::NOTLIKE         "NOTLIKE"
\pine\bamboo\Where::NOTLIKE_        "NOTLIKE%"
\pine\bamboo\Where::_NOTLIKE        "%NOTLIKE"
\pine\bamboo\Where::NOT             "NOT"
\pine\bamboo\Where::MATCH           "MATCH"
\pine\bamboo\Where::EQUAL           "="
\pine\bamboo\Where::GRATERLEFT      ">"
\pine\bamboo\Where::GRATERRIGHT     "<"
\pine\bamboo\Where::ABOVELEFT       ">="
\pine\bamboo\Where::ABOVERIGHT      "<="
\pine\bamboo\Where::INETABOVERIGHT  "<<="
\pine\bamboo\Where::INETABOVELEFT   ">>="
\pine\bamboo\Where::CONTRADICTION   "<>"
\pine\bamboo\Where::NOTEQUAL        "!="
\pine\bamboo\Where::IN              "IN"
\pine\bamboo\Where::NOTIN           "NOTIN"
\pine\bamboo\Where::ISNULL          "ISNULL"
\pine\bamboo\Where::ISNOTNULL       "ISNOTNULL"
\pine\bamboo\Where::BETWEEN         "BETWEEN"
\pine\bamboo\Where::NOTBETWEEN      "NOTBETWEEN"
\pine\bamboo\Where::EXISTS          "EXISTS"
\pine\bamboo\Where::NOTEXISTS       "NOTEXISTS"
\pine\bamboo\Where::REGEXP          "REGEXP"
\pine\bamboo\Where::NOTREGEXP       "NOTREGEXP"
\pine\bamboo\Where::REGEXMATCHSENSITIVE         "~"
\pine\bamboo\Where::REGEXMATCHINSENSITVE        "~*"
\pine\bamboo\Where::REGEXNOTMATCHSENSITIVE      "!~"
\pine\bamboo\Where::REGEXNOTMATCHINSENSITIVE    "!~*"
\pine\bamboo\Where::ILIKE           "ILIKE"
\pine\bamboo\Where::ILIKE_          "ILIKE%"
\pine\bamboo\Where::_ILIKE          "%ILIKE"
\pine\bamboo\Where::NOTILIKE        "NOTILIKE"
\pine\bamboo\Where::NOTILIKE_       "NOTILIKE%"
\pine\bamboo\Where::_NOTILIKE       "%NOTILIKE"

Public methods

public function add($val) : void

Where条件を追加する。

public function setAndOr(string $val) : void

Whereの一致条件を設定する。and_orプロパティで直接設定可能。

AND または OR。(ORがPHPの予約語のため、定数は用意されていません)

■Where使用例
$w  = new \pine\bamboo\Where(["user_id", "pine_user"], ["upd_at", "2019-12-06 00:00:00", \pine\bamboo\Where::ABOVELEFT]);
生成されるSQL
WHERE `user_id` = :user_id_0 AND `upd_at` >= :upd_at_1
■手続き型でのWhere使用例
$w  = new \pine\bamboo\Where();
$w->add(["user_id", "pine_user"]);
$w->add(["user_id", "feijoa_user"]);
$w->and_or = "OR";
生成されるSQL
WHERE `user_id` = :user_id_0 OR `user_id` = :user_id_1
■Whereのネスト
$w1         = new \pine\bamboo\Where(["user_id", "pine_user"], ["user_id", "feijoa_user"]);
$w1->and_or = "OR";

$w2         = new \pine\bamboo\Where($w1, ["upd_at", "2019-12-06 00:00:00", \pine\bamboo\Where::ABOVELEFT]);
生成されるSQL
WHERE (`user_id` = :user_id_0 OR `user_id` = :user_id_1) AND `upd_at` >= :upd_at_2
■MATCHでのWhere使用例
$w  = new \pine\bamboo\Where(["user_id", "pine_user", \pine\bamboo\Where::MATCH]);
生成されるSQL
WHERE `user_id` = :user_id_0
■MATCHでのWhere使用例(NULL)
$w  = new \pine\bamboo\Where(["user_id", null, \pine\bamboo\Where::MATCH]);
生成されるSQL
WHERE `user_id` IS NULL
■MATCHでのWhere使用例(INET_ATON)

第4引数にWhere::INETATONを指定することでINET_ATON()関数の利用が可能。(MySQLのみ)

$w  = new \pine\bamboo\Where(["ip_address", "192.168.1.0", \pine\bamboo\Where::MATCH, \pine\bamboo\Where::INETATON]);
生成されるSQL
WHERE `ip_address` = INET_ATON(:user_id_0)
■NOTでのWhere使用例
$w  = new \pine\bamboo\Where(["user_id", "pine_user", \pine\bamboo\Where::NOT]);
生成されるSQL
WHERE NOT (`user_id` = :user_id_0)
■NOTでのWhere使用例(NULL)
$w  = new \pine\bamboo\Where(["user_id", null, \pine\bamboo\Where::NOT]);
生成されるSQL
WHERE `user_id` IS NOT NULL
■LIKEでのWhere使用例
\pine\bamboo\Where::LIKE        "LIKE"
\pine\bamboo\Where::LIKE_       "LIKE%"
\pine\bamboo\Where::_LIKE       "%LIKE"
\pine\bamboo\Where::NOTLIKE     "NOTLIKE"
\pine\bamboo\Where::NOTLIKE_    "NOTLIKE%"
\pine\bamboo\Where::_NOTLIKE    "%NOTLIKE"
\pine\bamboo\Where::ILIKE       "ILIKE"
\pine\bamboo\Where::ILIKE_      "ILIKE%"
\pine\bamboo\Where::_ILIKE      "%ILIKE"
\pine\bamboo\Where::NOTILIKE    "NOTILIKE"
\pine\bamboo\Where::NOTILIKE_   "NOTILIKE%"
\pine\bamboo\Where::_NOTILIKE   "%NOTILIKE"
$w  = new \pine\bamboo\Where(["user_id", "user", \pine\bamboo\Where::LIKE]);
生成されるSQL
WHERE `user_id` LIKE :user_id
■INでのWhere使用例
\pine\bamboo\Where::IN      "IN"
\pine\bamboo\Where::NOTIN   "NOTIN"
$w  = new \pine\bamboo\Where(["user_id", ["user_a", "user_b", "user_c"], \pine\bamboo\Where::IN]);
生成されるSQL
WHERE `user_id` IN (:user_id_0, :user_id_1, :user_id_2)
■BETWEENでのWhere使用例
\pine\bamboo\Where::BETWEEN     "BETWEEN"
\pine\bamboo\Where::NOTBETWEEN  "NOTBETWEEN"
$w  = new \pine\bamboo\Where(["age", [30, 45], \pine\bamboo\Where::BETWEEN]);
生成されるSQL
WHERE (`age` BETWEEN :age_0 AND :age_1)
■EXISTS句でのWhere使用例
\pine\bamboo\Where::EXISTS      "EXISTS"
\pine\bamboo\Where::NOTEXISTS   "NOTEXISTS"
$w1     = new \pine\bamboo\Where(["col_a", 1], ["col_b", 2]);

$select = new \pine\bamboo\Select(null, "col_a", "test_a", $w1);

$w2     = new \pine\bamboo\Where([null, $select, \pine\bamboo\Where::EXISTS]);
生成されるSQL
WHERE EXISTS (SELECT `col_a` FROM `test_a` WHERE `col_a` = :col_a_0 AND `col_b` = :col_b_1)

GroupByオブジェクト

NameSpace

\pine\bamboo

Public methods

public function add($val) : void

GroupBy条件を追加する。

private function setHaving(\pine\bamboo\Having $having) : void

Having条件を追加する。havingプロパティで直接設定可能。 \pine\bamboo\Havingオブジェクトを設定する。

■GroupByの使用例
$g          = new \pine\bamboo\GroupBy(["user_id", "prefecture"]);
生成されるSQL
GROUP BY `user_id`, `prefecture`
■手続き型でのGroupByの使用例
$g          = new \pine\bamboo\GroupBy();
$g->add(["user_id", "prefecture"]);
生成されるSQL
GROUP BY `user_id`, `prefecture`
■GroupByの使用例(HAVING)
$g          = new \pine\bamboo\GroupBy(["user_id", "prefecture"]);
$h          = new \pine\bamboo\Having(["user_id", "pine_user"], ["prefecture", "Osaka", "NOT"]);
$g->having  = $h;
生成されるSQL
GROUP BY `user_id`, `prefecture` HAVING `user_id` = :user_id_0 AND NOT (`prefecture` = :prefecture_1)

Havingオブジェクト

NameSpace

\pine\bamboo
■Havingの使用例

※Havingに渡される配列の第3引数及び第4引数はWhereオブジェクトを参照。

$h          = new \pine\bamboo\Having(["user_id", "pine_user"], ["prefecture", "Osaka", "NOT"]);
生成されるSQL
HAVING `user_id` = :user_id_0 AND NOT (`prefecture` = :prefecture_1)
■Havingの使用例2
$h          = new \pine\bamboo\Having();
$h->having  = [["user_id", "pine_user"], [user_id", "feijoa_user"]];
$h->and_or  = "OR";
生成されるSQL
HAVING `user_id` = :user_id_0 OR `user_id` = :user_id_1

OrderByオブジェクト

NameSpace

\pine\bamboo

定数

\pine\bamboo\OrderBy::ASC       "ASC"
\pine\bamboo\OrderBy::DESC      "DESC"

Public methods

public function add($val) : void

OrderBy条件を追加する。order_byプロパティで直接設定可能。

■OrderByの使用例
$o  = new \pine\bamboo\OrderBy(["col_1", \pine\bamboo\OrderBy::ASC], ["col_2", \pine\bamboo\OrderBy::DESC]);
生成されるSQL
ORDER BY `col_1` ASC, `col_2` DESC
■手続き型でのOrderByの使用例
$o  = new \pine\bamboo\OrderBy();
$o->add(["col_1", \pine\bamboo\OrderBy::ASC])
$o->add(["col_2", \pine\bamboo\OrderBy::DESC]);
生成されるSQL
ORDER BY `col_1` ASC, `col_2` DESC
■プロパティ設定でのOrderByの使用例
$o              = new \pine\bamboo\OrderBy();
$o->order_by    = [["col_1", \pine\bamboo\OrderBy::ASC], ["col_2", \pine\bamboo\OrderBy::DESC]];
生成されるSQL
ORDER BY `col_1` ASC, `col_2` DESC

Limitオブジェクト

NameSpace

\pine\bamboo
■Limitの使用例
$l  = new \pine\bamboo\Limit(5);
生成されるSQL
LIMIT 5
■Limitの使用例(offsetあり)
$l  = new \pine\bamboo\Limit(5, 3);
生成されるSQL
LIMIT 5 OFFSET 3
■プロパティ設定でのLimitの使用例
$l          = new \pine\bamboo\Limit();
$l->count   = 5;
$l->offset  = 3;
生成されるSQL
LIMIT 5 OFFSET 3

Selectオブジェクト

NameSpace

\pine\bamboo

Constructor

public function __construct(
    string                  $alias      = null,
    string                  $select     = null,
    string                  $from       = null, 
    \pine\bamboo\Where      $where      = null, 
    \pine\bamboo\GroupBy    $group_by   = null, 
    \pine\bamboo\OrderBy    $order_by   = null, 
    \pine\bamboo\Limit      $limit      = null, 
    bool                    $lock       = false
)

記事リンク