ThinkPHP CURD方法のwhere方法詳細

9869 ワード

ThinkPHP CURD操作の問い合わせ方法の中で最もよく使われていますが、最も複雑なのがwhere方法です。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();

複数の配列条件表式は最終的に統合されますが、文字列条件は一回だけサポートされます。