ThinkPHP CURD方法のwhere方法詳細
ThinkPHP CURD操作の問い合わせ方法の中で最もよく使われていますが、最も複雑なのがwhere方法です。where方法はモデル類の一貫した操作方法の一つであり、主に照会と操作条件の設定に用いられる。
whereメソッドの使い方はThinkPHPクエリ言語の真髄であり、ThinkPHP ORM(対象関係マップ)の重要な構成部分とスポットライトの所在地であり、通常の照会、表式クエリ、クイッククエリ、区間照会、コンビネーションクエリを含むクエリー操作を行うことができます。whereメソッドのパラメータは文字列と配列をサポートしています。オブジェクトを使用することもできますが、推奨されていません。
1.文字列条件
文字列条件を使って直接に検索したり、操作したりします。
文字列前処理フォーマットタイプは、指定された数字、文字列などをサポートしています。具体的には、vsprintfメソッドのパラメータ説明を参照することができます。
2.配列条件
配列条件のwhereの使い方はThinkPHPのオススメの使い方です。
一般クエリー
一番簡単な配列クエリの方式は以下の通りです。
上のクエリー条件は単純な等しい判断にすぎません。クエリー式はより多くのSQLクエリ文法をサポートします。クエリー式はフォーマットを使用します。
表式
意味
EQ
イコール(=)
NEQ
等しくない(<>)
GT。
大きい(>)
EGT
以上(>=)
LT。
小さい(<)
ELT
小なりイコール(=)
LIKE
あいまい検索
[NOT] BETWEEN
(不在)区間照会
[NOT] IN
(不在)IN クエリー
EXP
SQL構文をサポートする表式クエリー
例は以下の通りです
EQ:等しい(=)
たとえば:
NEQ:等しくない(<>)
たとえば:
GT:大きい(>)
たとえば:
EGT:大なり(>=)
たとえば:
LT:小さい(<)
たとえば:
ELT:小なり(<=)
たとえば:
【NOT】LIKE:同sqlのLIKE
たとえば:
DB_を配置したらリック.FIEDSパラメータの場合、フィールドによっては自動的にぼかし照会が行われます。例えば設定されています
行列方式をサポートします。たとえば
[NOT]IN:sqlの[not]inと、照会条件は文字列または配列をサポートしています。例えば、
EXP:表式で、より複雑な照会状況をサポートします。
たとえば:
クエリー表現は、クエリー条件だけでなく、データ更新などにも使用できます。
whereメソッドはショートカットクエリ方式をサポートしており、クエリー条件の書き方をさらに簡略化することができます。
一、異なるフィールドで同じクエリー条件を実現する
二、異なるフィールドの異なるクエリー条件を実現する。
ショートカットの照会方法では、「|」と「&」は同時に使用できません。
区間検索
whereメソッドは、あるフィールドのインターバルクエリをサポートします。例えば、
最後の一つはAND、ORまたはXOR演算子であってもいいです。書かなければ、デフォルトはAND演算です。
区間検索の条件は、一般的なクエリーのすべての表現をサポートします。つまり、LIKE、GT、EXPのような表現がサポートされます。また、インターバルクエリは、さらに多くの条件をサポートしてもよく、例えば、フィールドに対する条件が一緒に書き込まれてもよい。
グループクエリは複雑な検索条件に使用されます。検索時に文字列をたまに使いますが、配列方式の柔軟さを望まないなら、グループクエリを使用することも考えられます。
クエリーの組み合わせの主体はやはり配列方式で照会します。文字列パターンクエリ(_u)を含むいくつかの特殊なクエリーサポートが追加されています。string、複合クエリcompplex)、要求文字列クエリ(_query)は、クエリーの中の特殊なクエリーは、クエリーごとに1つしか定義できません。配列の索引方式を採用するため、インデックスが同じ特殊なクエリーが上書きされます。
一、文字列パターンクエリ(_を使用します。stringを照会条件とする)
配列条件は、例えば、文字列条件と混合してもよい。
要求文字列クエリは、URL参照と同様の方法であり、簡単な条件等しい判断をサポートすることができる。
三、複合クエリ
複合クエリは、新しいクエリー条件をカプセル化し、元のクエリー条件に組み込むことに相当するので、より複雑なクエリ条件の組み立てを行うことができる。
たとえば:
多くの照会方法は、相互に変換されてもよく、例えば上記のクエリー条件は、以下のように変更されてもよい。
3.マルチ呼び出し
3.1.3バージョンから、whereメソッドは複数回の呼び出しをサポートしていますが、文字列条件は一回だけ現れます。例えば、
whereメソッドの使い方はThinkPHPクエリ言語の真髄であり、ThinkPHP ORM(対象関係マップ)の重要な構成部分とスポットライトの所在地であり、通常の照会、表式クエリ、クイッククエリ、区間照会、コンビネーションクエリを含むクエリー操作を行うことができます。whereメソッドのパラメータは文字列と配列をサポートしています。オブジェクトを使用することもできますが、推奨されていません。
1.文字列条件
文字列条件を使って直接に検索したり、操作したりします。
$User = M("User"); // User
$User->where('type=1 AND status=1')->select();
最後に生成されたSQL文は
SELECT * FROM think_user WHERE type=1 AND status=1
3.1以上のバージョンを使用すると、文字列条件を使用する場合、前処理機構に協力して、より安全を確保することが推奨されます。
$Model->where("id=%d and username='%s' and xx='%f'",array($id,$username,$xx))->select();
または使用:
$Model->where("id=%d and username='%s' and xx='%f'",$id,$username,$xx)->select();
ドルID変数がユーザから送信されたり、URLアドレスが入力されたりすると、入力された数字以外のタイプの場合は、強制的に数値フォーマットにフォーマットされてクエリー操作が行われます。文字列前処理フォーマットタイプは、指定された数字、文字列などをサポートしています。具体的には、vsprintfメソッドのパラメータ説明を参照することができます。
2.配列条件
配列条件のwhereの使い方はThinkPHPのオススメの使い方です。
一般クエリー
一番簡単な配列クエリの方式は以下の通りです。
$User = M("User"); // User
$map['name'] = 'thinkphp';
$map['status'] = 1;
//
$User->where($map)->select();
最後に生成されたSQL文は
SELECT * FROM think_user WHERE `name`='thinkphp' AND status=1
表式クエリー上のクエリー条件は単純な等しい判断にすぎません。クエリー式はより多くのSQLクエリ文法をサポートします。クエリー式はフォーマットを使用します。
$map[' 1'] = array(' ',' 1');
$map[' 2'] = array(' ',' 2');
$Model->where($map)->select(); //
表式には大文字と小文字の区別なく、サポートされているクエリー表式には以下のような種類があります。表式
意味
EQ
イコール(=)
NEQ
等しくない(<>)
GT。
大きい(>)
EGT
以上(>=)
LT。
小さい(<)
ELT
小なりイコール(=)
LIKE
あいまい検索
[NOT] BETWEEN
(不在)区間照会
[NOT] IN
(不在)IN クエリー
EXP
SQL構文をサポートする表式クエリー
例は以下の通りです
EQ:等しい(=)
たとえば:
$map['id'] = array('eq',100);
以下のクエリーと等価です。
$map['id'] = 100;
表示される検索条件はid=100です。NEQ:等しくない(<>)
たとえば:
$map['id'] = array('neq',100);
表示される検索条件はid<>100です。GT:大きい(>)
たとえば:
$map['id'] = array('gt',100);
表示される検索条件はid>100です。EGT:大なり(>=)
たとえば:
$map['id'] = array('egt',100);
表示される検索条件はid>=100です。LT:小さい(<)
たとえば:
$map['id'] = array('lt',100);
表示される検索条件はid<100>です。ELT:小なり(<=)
たとえば:
$map['id'] = array('elt',100);
表示される検索条件はid<=100>です。【NOT】LIKE:同sqlのLIKE
たとえば:
$map['name'] = array('like','thinkphp%');
検索条件はname like'thinkphp'になります。DB_を配置したらリック.FIEDSパラメータの場合、フィールドによっては自動的にぼかし照会が行われます。例えば設定されています
'DB_LIKE_FIELDS'=>'title|content'
を使うと
$map['title'] = 'thinkphp';
検索条件はname like'%thinkphp'になります。行列方式をサポートします。たとえば
$map['a'] =array('like',array('%thinkphp%','%tp'),'OR');
$map['b'] =array('notlike',array('%thinkphp%','%tp'),'AND');
生成されたクエリー条件は、
(a like '%thinkphp%' OR a like '%tp') AND (b not like '%thinkphp%' AND b not like '%tp')
[NOT]BETWEEN:Sqlの[not]betweenと、検索条件は文字列または配列をサポートしています。例えば、
$map['id'] = array('between','1,8');
以下の等価:
$map['id'] = array('between',array('1','8'));
検索条件はid BETWEEN 1 AND 8になります。[NOT]IN:sqlの[not]inと、照会条件は文字列または配列をサポートしています。例えば、
$map['id'] = array('not in','1,5,8');
以下の等価:
$map['id'] = array('not in',array('1','5','8'));
検索条件はid NOT IN(1,5,8)になります。EXP:表式で、より複雑な照会状況をサポートします。
たとえば:
$map['id'] = array('in','1,3,8');
変更できます
$map['id'] = array('exp',' IN (1,3,8) ');
expクエリーの条件は文字列として扱われないので、後のクエリー条件は、関数とフィールド名を含むSQLサポートの構文を使用することができます。クエリー表現は、クエリー条件だけでなく、データ更新などにも使用できます。
$User = M("User"); // User
//
$data['name'] = 'ThinkPHP';
$data['score'] = array('exp','score+1');// 1
$User->where('id=5')->save($data); //
ショートカットクエリwhereメソッドはショートカットクエリ方式をサポートしており、クエリー条件の書き方をさらに簡略化することができます。
一、異なるフィールドで同じクエリー条件を実現する
$User = M("User"); // User
$map['name|title'] = 'thinkphp';
//
$User->where($map)->select();
検索条件はname='thinkphp'OR title='thinkphp'になります。二、異なるフィールドの異なるクエリー条件を実現する。
$User = M("User"); // User
$map['status&title'] =array('1','thinkphp','_multi'=>true);
//
$User->where($map)->select();
同前multi'=>trueは配列の最後に追加しなければなりません。現在は多条件マッチングを表しています。このようにクエリ条件はstatus=1 AND title='thinkphp'となり、クエリーフィールドはより多くのサポートを提供します。
$map['status&score&title'] =array('1',array('gt','0'),'thinkphp','_multi'=>true);
検索条件はstatus=1 AND score>0 AND title='thinkphp'になります。ショートカットの照会方法では、「|」と「&」は同時に使用できません。
区間検索
whereメソッドは、あるフィールドのインターバルクエリをサポートします。例えば、
$map['id'] = array(array('gt',1),array('lt',10)) ;
得られた照会条件は,(`id`>1)AND(`id`<10)です。
$map['id'] = array(array('gt',3),array('lt',10), 'or') ;
得られた照会条件は、(`id`>3)OR(`id`<10)です。
$map['id'] = array(array('neq',6),array('gt',3),'and');
得られた検索条件は:(`id`!=6)AND(`id`>3)最後の一つはAND、ORまたはXOR演算子であってもいいです。書かなければ、デフォルトはAND演算です。
区間検索の条件は、一般的なクエリーのすべての表現をサポートします。つまり、LIKE、GT、EXPのような表現がサポートされます。また、インターバルクエリは、さらに多くの条件をサポートしてもよく、例えば、フィールドに対する条件が一緒に書き込まれてもよい。
$map['name'] = array(array('like','%a%'), array('like','%b%'), array('like','%c%'), 'ThinkPHP','or');
最後のクエリー条件は以下の通りです。
(`name` LIKE '%a%') OR (`name` LIKE '%b%') OR (`name` LIKE '%c%') OR (`name` = 'ThinkPHP')
グループクエリグループクエリは複雑な検索条件に使用されます。検索時に文字列をたまに使いますが、配列方式の柔軟さを望まないなら、グループクエリを使用することも考えられます。
クエリーの組み合わせの主体はやはり配列方式で照会します。文字列パターンクエリ(_u)を含むいくつかの特殊なクエリーサポートが追加されています。string、複合クエリcompplex)、要求文字列クエリ(_query)は、クエリーの中の特殊なクエリーは、クエリーごとに1つしか定義できません。配列の索引方式を採用するため、インデックスが同じ特殊なクエリーが上書きされます。
一、文字列パターンクエリ(_を使用します。stringを照会条件とする)
配列条件は、例えば、文字列条件と混合してもよい。
$User = M("User"); // User
$map['id'] = array('neq',1);
$map['name'] = 'ok';
$map['_string'] = 'status=1 AND score>10';
$User->where($map)->select();
最後に入手した検索条件は以下の通りです。
( `id` != 1 ) AND ( `name` = 'ok' ) AND ( status=1 AND score>10 )
二、要求文字列の照会方式要求文字列クエリは、URL参照と同様の方法であり、簡単な条件等しい判断をサポートすることができる。
$map['id'] = array('gt','100');
$map['_query'] = 'status=1&score=100&_logic=or';
検索条件は、`id`100 AND(`status`='1'OR`score`='100')です。三、複合クエリ
複合クエリは、新しいクエリー条件をカプセル化し、元のクエリー条件に組み込むことに相当するので、より複雑なクエリ条件の組み立てを行うことができる。
たとえば:
$where['name'] = array('like', '%thinkphp%');
$where['title'] = array('like','%thinkphp%');
$where['_logic'] = 'or';
$map['_complex'] = $where;
$map['id'] = array('gt',1);
検索条件は
( id > 1) AND ( ( name like '%thinkphp%') OR ( title like '%thinkphp%') )
複合クエリは_を使用しています。complexはサブクエリ条件として定義されています。これまでの照会方法に合わせて、より複雑な照会条件を柔軟に作成することができます。多くの照会方法は、相互に変換されてもよく、例えば上記のクエリー条件は、以下のように変更されてもよい。
$where['id'] = array('gt',1);
$where['_string'] = ' (name like "%thinkphp%") OR ( title like "%thinkphp") ';
最後に生成されたSQL文は一致しています。3.マルチ呼び出し
3.1.3バージョンから、whereメソッドは複数回の呼び出しをサポートしていますが、文字列条件は一回だけ現れます。例えば、
$map['a'] = array('gt',1);
$where['b'] = 1;
$Model->where($map)->where($where)->where('status=1')->select();
複数の配列条件表式は最終的に統合されますが、文字列条件は一回だけサポートされます。