Curry
PHP Framework

core

db

html

utility

SqlSelect

クラス概要

SqlSelectはSQLのSELECT文構築の機能を提供します。
通常、SqlSelectのインスタンスはModel::selectメソッドにより取得します。これにより、Modelに設定されているテーブルに対するSELECT文構築オブジェクトとして機能することになります。
SELECT文として必要なWHEREやORDER BY等の各条件指定は個々にその設定メソッドが存在し、SqlSelectのインスタンスに対して順番に付与していくような手法を取ります。

SqlSelectでwhere条件を指定すると内部的にはプレースホルダを利用してWHERE句が構築されます。そのためSQLインジェクションに対して安全です。この事の詳細についてはwhereメソッドの説明を参照してください。

SqlSelectの各メソッドはそのほとんどが自分自身のインスタンスを返します。そのため、メソッドチェーンを利用して柔軟なコーディングが可能です。

クラスファイル位置

curry/db/sql_select.php

フィールド

公開されるフィールドはありません。

メソッド

メソッド名 アクセス 概要
fields public SELECT文による抽出対象フィールドを指定します。
これはSQL文中のSELECT句に記述する内容そのものです。
または、一つ一つのフィールドを配列で指定することも可能です。
このメソッドを複数回実行した場合、前回追加したものを保持したまま、追加されていきます。
distinct public SELECT文に対してDISTINCTキーワードを使用し、行の重複が取り除かれた状態でクエリ結果を得たい場合にこのメソッドを実行します。
行の重複とは、SELECT分で出力対象とする全ての列の値が同じ行のことを指します。

※バージョン1.2.0以降
order public ORDER BY条件を指定します。
これはSQL文中のORDER BY句に記述する内容そのものです。
または、一つ一つのフィールドを配列で指定することも可能です。
limit public SELECT分文の結果として取得するレコードの最大件数を設定します。
これはSQL文中のLIMIT句の内容そのものです。
offset public SELECT文のクエリ結果として取得する先頭行のずらし量指定します。これはSQL文のOFFSET句で記述する内容そのものです。
このメソッドを実行せず、通常の場合であれば結果の1行目からが得られますが、例えば5を指定すれば5行後ろにずれ、6行目以降が取得されます。
SQL文でOFFSETは単独では指定できず、LIMITと共に使用します。
LIMIT 10 OFFSET 10 とすれば、11行目~20行目が取得されます。
これをSqlSelectのメソッドで行う場合、
$select->limit(10)->offset(10);
となります。
group public SQLのGROUP BY句の条件を指定します。
指定方法はGROUP BY句に記述する内容そのままの記述か、または個々のフィールドを配列で指定することも可能です。
join public joinInnerのエイリアスです。joinInnerを参照してください。
joinInner public テーブルの内部結合(INNER JOIN)を設定します。
第1パラメーターに対象テーブル、第2パラメーターに結合条件を指定します。
対象テーブルの指定は文字列によりテーブル名を指定するか、またはモデルクラスの指定も可能です。
結合条件の指定は、ON句の内容をのままを文字列で指定するか、一つ一つの条件を配列で指定することも可能です。その場合は全ての条件がAND結合により、されます。
joinLeft public テーブルの左外部結合を設定します。
結合の種別がLEFT OUTER JOINであるということ以外はjoinInnerと全く同じです。
詳しくはjoinInnerを参照してください。
joinRight public テーブルの右外部結合を設定します。
結合の種別がRIGHT OUTER JOINであるということ以外はjoinInnerと全く同じです。
詳しくはjoinInnerを参照してください。
joinCross public CROSS JOINによるテーブルの交差結合を設定します。


※バージョン1.2.0以降
setAlias public SqlSelectのインスタンスを、他のSQL生成オブジェクトのサブクエリとして使用する場合に、サブクエリのエイリアスを指定します。
サブクエリを利用する場合、通常は内部で自動的に設定されるため、特に指定の必要はありません。
fetch public クエリ結果を1行取得します。実行前にexecuteメソッドを実行しておく必要があります。
fetchAll public 設定された条件を全て反映してSQL文を構築し、実行します。そしてそのクエリ結果を行・列の2次元配列で取得します。
fetchRow public 設定された条件を全て反映してSQL文を構築し、実行します。そしてそのクエリ結果の1行目を返します。
fetchScalar public 設定された条件を全て反映してSQL文を構築し、実行します。そしてそのクエリ結果の1行目の、指定フィールドの値を返します。
fetchMax public 設定された条件に合致するクエリ結果のうちの、指定フィールドの最大値を返します。
fetchMin public 設定された条件に合致するクエリ結果のうちの、指定フィールドの最小値を返します。
fetchCount public 設定された条件に合致するクエリ結果の行数を返します。
fetchSum public 設定された条件に合致するクエリ結果の、パラメーターで指定されたフィールドの合計値を取得します。
from public FROM句にに設定するテーブル名等を直接指定します。
通常はテーブル名が自動的に設定されるため、このメソッドを実行することはほとんどないでしょう。
例えばFROM句にテーブル名ではなくサブクエリを指定した場合などは指定が必要になります。
この場合、別のSqlSelectのインスタンスをfromの引数に指定することでサブクエリをFROM句に設定することが可能です。

※バージョン1.1.0以降
having public HAVING条件の指定を行います。
HAVING句はGROUP BYの結果に対する絞込み条件指定のため、
groupメソッドによるGROUP BYの指定と組み合わせるのが前提です。

指定方法はHAVING条件文を直接指定するだけです。

$select->fields(array('age', 'COUNT(*) AS cnt'));
$select->group('age');
$select->having('COUNT(*) > 5');
→SELECT age, COUNT(*) AS cnt FROM user GROUP BY age HAVING (COUNT(*) > 5)

※バージョン1.1.0以降
orHaving public HAVING条件の指定をOR結合で行います。
havingメソッドのOR版です。

$select->fields(array('age', 'COUNT(*) AS cnt'));
$select->group('age');
$select->having('COUNT(*) > 30');
$select->orHaving('COUNT(*) < 10');
→SELECT age, COUNT(*) AS cnt FROM user GROUP BY age HAVING (COUNT(*) > 30) OR (COUNT(*) < 10)

最初の一つ目の条件指定の場合にはhavingもorHavingも違いはありません。

※バージョン1.1.0以降
union public UNION構文により、複数のSELECT文のクエリ結果を行方向に結合することが出来ます。
メソッドの利用方法は、
まず2つのSqlSelectのインスタンスを用意し、一方のインスタンスでunionメソッドを実行し、その引数にもう一方のインスタンスを指定します。
連続してunionメソッドを実行することで、たくさんのUNION結合が可能です。

また、SqlSelectインスタンスではなく、SELECT文を文字列として直接指定する事もできます。
どちらの場合でも、UNION構文のルールに従い、結合対象のすべてのSELECT文は列の数が一致していなければなりません。

unionAllメソッドとの違いは、構文的に"UNION"か"UNION ALL"かの違いですが、
UNIONの場合には結合の結果、重複する行は削除され、重複の存在しない状態のクエリ結果が得られます。

※バージョン1.1.0以降
unionAll public UNION ALL構文により、複数のSELECT文のクエリ結果を行方向に結合することが出来ます。
メソッドの利用方法はunionメソッドと同様です。

unionメソッドとの違いは、構文的に"UNION"か"UNION ALL"かの違いですが、
UNION ALLの場合には結合の結果、全く同一の行が重複しても削除はされず、そのままクエリ結果として反映されます。

※バージョン1.1.0以降

継承メソッド()

メソッド名 アクセス 概要
__construct public コンストラクタです。
getSql public 事前に設定された各条件をもとにSQL文を構築し、返します。
getParams public 現在設定されているプレースホルダパラメータを取得します。
enablePreparing public 同一インスタンスで連続してSQLを実行した場合、1回目の実行時にプリペアを行ってステートメントを生成し、以降の実行は生成されたプリペアドステートメントを利用して実行しますが、
このメソッドではこのプリペアドステートメントを利用するかしないかを設定します。

誤解してはいけないのが、Curryでは基本的に全てのSQLの実行はプリペアしています。
このメソッドで行う設定は、最初の1回目のプリペアドステートメントを使い続けるか、
それとも都度再生成するかの違いです。
最利用する方が効率が良いので、通常は特に意識する必要はなく、初期値のままで構いません。

※バージョン1.1.0以降
params public プレースホルダパラメータの値をセットします。
SQL文中に":"(コロン)で始まるプレースホルダが存在する場合、そのプレースホルダに当てはめる値をプレースホルダ名と値の組み合わせで指定します。

指定の方法は二通りあります。
一つはプレースホルダ名をキーとする連想配列で指定する方法。この場合は複数同時に指定がかのうです。
もう一つは第一引数にプレースホルダ名、第二引数に値を指定する方法で、この場合はひとつずつしか設定できません。

このメソッドによる指定時、プレースホルダ名の指定は先頭の":"(コロン)を付加してはいけません。内部で自動的に付加しています。
execute public SQL文を構築し、実行します。
clearConditions public whereやorder等、各メソッドで設定された条件を全てクリアします。
getStatement public 直前に実行したSQLのプリペアドステートメントを取得します。
where public WHERE条件の指定を行います。
指定の仕方はいくつか存在します。

1,フィールド名と値の組み合わせで指定
$select->where('age', 30);

2,ハッシュで指定
$select->where(array('age' => 30));

3,WHERE条件文を直接指定
$select->where("age = 30");

SQLインジェクション対策のため、値は直接WHERE句中に含めるべきではありません。
値の指定はプレースホルダ化し、パラメーターとして別指定するのが望ましいです。
上記の3パターンのうち、1や2のような指定の仕方をした場合、内部で自動的にプレースホルダとして処理してくれますが、3のように直接条件文に値を記述するのは安全ではありません。この場合、以下のようにするべきです。

$select->where("age = :age");
$select->params(array('age' => 30));

whereメソッドを複数回実行した場合、各条件をAND結合します。
$select->where('age', 30);
$select->where('name', 'taro');
→WHERE (age = 30) AND (name = 'taro')

値にnullが指定された場合はデータベースの値としてもNULLで比較します。
$select->where('name', null);
→WHERE (name IS NULL)
orWhere public WHERE条件をOR結合で設定します。
whereメソッドとの違いは、既にWHERE条件の指定が一度でも行われている場合に、直前の条件との結合が"AND"ではなく"OR"になるということです。

$select->where('age', 30);
$select->orWhere('name', 'taro');
→WHERE (age = 30) OR (name = 'taro')

そのため、最初の一つ目の条件指定の場合に限り、whereでもorWhereでも結果は同じになります。

条件の指定方法はwhereメソッドと同様なのでwhereメソッドの説明を参照してください。
whereNot public 否定のWHERE条件を指定します。

whereメソッドとの違いは、フィールド名と値の比較演算子が"="ではなく"<>"になるということです。
値がnullの場合は"IS NULL"ではなく"IS NOT NULL"になります。

$select->whereNot('age', 30);
$select->whereNot('name', null);
→WHERE (age <> 30) AND (name IS NOT NULL)
orWhereNot public 否定のWHERE条件指定をOR結合で設定します。
whereNotのOR版です。

$select->whereNot('age', 30);
$select->orWhereNot('name', null);
→WHERE (age <> 30) OR (name IS NOT NULL)

orWhereメソッドと同様、最初の一つ目の条件指定時はwhereNotと違いはありません。
whereLike public LIKE演算子による曖昧条件の指定を行います。
このメソッドで値に"%"を含めるとあいまい条件検索が可能になります。

$select->where('age', 30);
$select->whereLike('name', 'ta%');
→WHERE (age = 30) AND (name LIKE 'ta%')
orWhereLike public LIKE演算子による曖昧条件をOR結合で指定します。
whereLikeメソッドのOR版です。

$select->where('age', 30);
$select->orWhereLike('name', 'ta%');
→WHERE (age = 30) OR (name LIKE 'ta%')

orWhereメソッドと同様、最初の一つ目の条件指定時はwhereLikeと違いはありません。
whereNotLike public LIKE演算子による否定の曖昧条件の指定を行います。
whereLikeの否定条件版です。

$select->where('age', 30);
$select->whereNotLike('name', 'ta%');
→WHERE (age = 30) AND (name NOT LIKE 'ta%')
orWhereNotLike public LIKE演算子による否定の曖昧条件をOR結合で指定します。
whereNoLikeのOR版です。

$select->where('age', 30);
$select->orWhereNotLike('name', 'ta%');
→WHERE (age = 30) OR (name NOT LIKE 'ta%')

orWhereメソッドと同様、最初の一つ目の条件指定時はwhereLikeと違いはありません。
whereIn public IN演算子による条件の指定を行います。
第二引数に複数の値を配列で指定することにより、すべての値のいずれかに合致する条件を指定することができます。

$ages = array(20, 21, 22, 23, 24, 25);
$select->where('name', 'taro');
$select->whereIn('age', $ages);
→WHERE (name = 'taro') AND (age IN (20, 21, 22, 23, 24, 25))
orWhereIn public IN演算子による条件をOR結合で指定します。
whereInのOR版です。

$ages = array(20, 21, 22, 23, 24, 25);
$select->where('name', 'taro');
$select->orWhereIn('age', $ages);
→WHERE (name = 'taro') OR (age IN (20, 21, 22, 23, 24, 25))

orWhereメソッドと同様、最初の一つ目の条件指定時はwhereInと違いはありません。
whereNotIn public IN演算子による否定の条件の指定を行います。
whereInの否定条件版です。
第二引数に複数の値を配列で指定することにより、すべての値のどれにも合致しない条件を指定することができます。

$ages = array(20, 21, 22, 23, 24, 25);
$select->where('name', 'taro');
$select->whereNotIn('age', $ages);
→WHERE (name = 'taro') AND (age NOT IN (20, 21, 22, 23, 24, 25))
orWhereNotIn public N演算子による否定の条件をOR結合で指定します。
whereNoInのOR版です。

$ages = array(20, 21, 22, 23, 24, 25);
$select->where('name', 'taro');
$select->orWhereNotIn('age', $ages);
→WHERE (name = 'taro') OR (age NOT IN (20, 21, 22, 23, 24, 25))
whereGt public 大なりのWHERE条件を指定します。
フィールド名と値の比較演算子を">"とし、対象列が条件指定した値より大きい事を条件とする場合に使用します。

$select->where('name', 'taro');
$select->whereGt('age', 30);
→WHERE (name = 'taro') AND (age > 30)

※バージョン1.2.0以降
whereLt public 小なりのWHERE条件を指定します。
フィールド名と値の比較演算子を"<"とし、対象列が条件指定した値より小さい事を条件とする場合に使用します。

$select->where('name', 'taro');
$select->whereLt('age', 30);
→WHERE (name = 'taro') AND (age < 30)

※バージョン1.2.0以降
whereGe public 大なりイコールのWHERE条件を指定します。
フィールド名と値の比較演算子を">="とし、対象列が条件指定した値より大きい、または等しい事を条件とする場合に使用します。

$select->where('name', 'taro');
$select->whereGe('age', 30);
→WHERE (name = 'taro') AND (age >= 30)

※バージョン1.2.0以降
whereLe public 小なりイコールのWHERE条件を指定します。
フィールド名と値の比較演算子を"<="とし、対象列が条件指定した値より小さい、または等しい事を条する場合に使用します。

$select->where('name', 'taro');
$select->whereLe('age', 30);
→WHERE (name = 'taro') AND (age <= 30)

※バージョン1.2.0以降
orWhereGt public 大なりの条件指定をOR結合で指定します。
whereGtメソッドのOR版です。

$select->where('age', 30);
$select->orWhereGt('name', 'taro');
→WHERE (age = 30) OR (name > 'taro')


※バージョン1.2.0以降
orWhereLt public 小なりの条件指定をOR結合で指定します。
whereLtメソッドのOR版です。

$select->where('age', 30);
$select->orWhereLt('name', 'taro');
→WHERE (age = 30) OR (name < 'taro')

※バージョン1.2.0以降
orWhereGe public 大なりイコールの条件指定をOR結合で指定します。
whereGeメソッドのOR版です。

$select->where('age', 30);
$select->orWhereGe('name', 'taro');
→WHERE (age = 30) OR (name >= 'taro')

※バージョン1.2.0以降
orWhereLe public 小なりイコールの条件指定をOR結合で指定します。
whereLeメソッドのOR版です。

$select->where('age', 30);
$select->orWhereLe('name', 'taro');
→WHERE (age = 30) OR (name <= 'taro')

※バージョン1.2.0以降
whereBetween public 範囲指定のWHERE条件を設定します。
BETWEEN演算子を使用し、対象列が指定した2つの値の範囲内であることを条件とする場合に指定します。

$select->where('name', 'taro');
$select->whereBetween('age', 30, 40);
→WHERE (name = 'taro') AND (age BETWEEN 30 AND 40)

※バージョン1.2.0以降
whereNotBetween public 否定の範囲指定のWHERE条件を設定します。
BETWEEN演算子を使用し、対象列が指定した2つの値の範囲外であることを条件とする場合に指定します。

$select->where('name', 'taro');
$select->whereNotBetween('age', 30, 40);
→WHERE (name = 'taro') AND (age NOT BETWEEN 30 AND 40)

※バージョン1.2.0以降
orWhereBetween public 範囲指定のWHERE条件をOR結合で設定します。
whereBetweenのOR版です。

$select->where('name', 'taro');
$select->orWhereBetween('age', 30, 40);
→WHERE (name = 'taro') OR (age BETWEEN 30 AND 40)

※バージョン1.2.0以降
orWhereNotBetween public 否定の範囲指定のWHERE条件をOR結合で設定します。
whereNotBetweenのOR版です。

$select->where('name', 'taro');
$select->orWhereNotBetween('age', 30, 40);
→WHERE (name = 'taro') OR (age NOT BETWEEN 30 AND 40)

※バージョン1.2.0以降