前回の記事では、基本的なデータ CURD メソッドをマスターしましたが、ビジネス ロジックの違いにより、特に複雑なビジネス ロジックでは CURD 操作がそれほど単純ではないことがよくあります。これは、ActiveRecord モデルの欠点でもあります。 。 ThinkPHP のクエリ言語と一貫した操作を組み合わせることで、複雑なビジネス ロジックの要件を十分に解決できます。この記事では、まずフレームワークのクエリ言語について詳しく理解します。
はじめに
ThinkPHP には、データ クエリ操作を迅速に実行できる非常に柔軟なクエリ メソッドが組み込まれており、クエリ条件は主に where メソッドなどの一貫した操作に使用されます。どのデータベースを使用するかにかかわらず、ほぼ同じクエリ メソッド (Mongo などの一部のデータベースには異なる式クエリがあります) を使用しても、システムは異なるデータベース間の違いを解決するのに役立つため、フレームワークのこのクエリ メソッドをクエリ言語と呼びます。クエリ言語は、ThinkPHP フレームワークの ORM のハイライトでもあり、クエリ操作をよりシンプルかつ理解しやすくします。クエリ言語の意味を一つずつ説明しましょう。
クエリメソッド
ThinkPHP はクエリ条件として文字列の直接使用をサポートできますが、ほとんどの場合、より安全であるため、クエリ条件としてインデックス配列またはオブジェクトを使用することをお勧めします。 1. クエリ条件として文字列を使用します。これは最も伝統的な方法ですが、あまり安全ではありません。例:
$User = M("User"); // User オブジェクトをインスタンス化します。 where( 'type=1 AND status=1')->select();
最終的に生成される SQL ステートメントは
SELECT * FROM think_user WHERE type=1 AND status=1 です
文字列クエリを使用する場合、次のことができます。新しいバージョンで提供される文字列条件と組み合わせて使用される安全な前処理メカニズムについては、当面は詳細に説明しません。 2. 配列をクエリ条件として使用するのが最も一般的に使用されるクエリ方法です。例:
$User = M("User"); // User オブジェクトをインスタンス化します
$condition['name'] = 'thinkphp' ;
$condition['status'] = 1;
// クエリ条件をクエリメソッドに渡します
$User->where($condition)->select();
最終的に生成された SQL ステートメントはい
SELECT * FROM think_user WHERE `name`='thinkphp' AND status=1
複数フィールドのクエリを実行する場合、フィールド間のデフォルトの論理関係は論理 AND ですが、デフォルトのロジックは次のコマンドを使用して変更できます。ルール判定、_logic を使用してクエリ ロジックを定義します。
$User = M("User") // User オブジェクトをインスタンス化します
$condition['name'] = 'thinkphp'; ] = 'thinkphp';
$condition['_logic'] = 'OR';
// クエリ条件をクエリメソッドに渡します
$User->where($condition)->select() ;
最終的に生成される SQL ステートメントは
SELECT * FROM think_user WHERE `name`='thinkphp' OR `account`='thinkphp' です
3. オブジェクト メソッドを使用してクエリを実行します。ここでは、stdClass 組み込みオブジェクトを取得します。例:
$ User = M("User"); // User オブジェクトをインスタンス化します
// クエリ条件を定義します
$condition = new stdClass(); name = 'thinkphp' ;
$condition->status= 1;
$User->where($condition)->select();
最終的に生成される SQL ステートメントは上記と同じです
SELECT * FROM think_user WHERE `name`='thinkphp' AND status=1
オブジェクト モードを使用したクエリと配列を使用したクエリの効果は同じであり、ほとんどの場合、効率を高めるために配列モードを使用することをお勧めします。
式クエリ
上記のクエリ条件は、単純な等価性判定にすぎません。クエリ式は、ThinkPHP クエリ言語の本質でもある、より多くの SQL クエリ構文をサポートするために使用できます。 クエリ式の形式は次のとおりです。 'フィールド名'] = array('式','クエリ条件'); 次のクエリ式はサポートされており、それぞれの意味は次のとおりです。 EQ 等しい (=)
NEQ 等しくない (<>)
GT より大きい (>)
EGT 以上 (>=)
LT 未満 (<)
ELT 以下 (<=)
LIKE ファジークエリ
[NOT] BETWEEN (Not) 間隔クエリ
[NOT] IN (Not) IN クエリ
EXP 式クエリ、SQL 構文をサポート
例は次のとおりです。:EQ: 等しい (=)
例:
$map['id'] = array('eq',100);
は次のクエリと同等です
$map['id '] = 100;
で表されるクエリ条件は、 id = 100NEQ: (<>) に等しくないです 例:
例:
例:
例:
例:
例:
クエリ条件は name like 'thinkphp%' になります
DB_LIKE_FIELDS パラメータが設定されている場合、一部のフィールドも自動的にファジー処理を実行しますクエリ。たとえば、次のように設定した場合:
配列モードをサポートします。例:
$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: 式になり、より複雑なクエリ状況をサポートします
例:
exp クエリの条件は文字列として扱われないため、後続のクエリ条件では、関数やフィールド名の使用を含め、SQL でサポートされている任意の構文を使用できます。クエリ式はクエリ条件だけでなく、データ更新にも使用できます。例: $User = M("User"); // User オブジェクトをインスタンス化します // 変更するデータ オブジェクト属性を割り当てます$ data['name'] = 'ThinkPHP';$data['score'] = array('exp','score+1');//ユーザーのポイントが1増加します$User ->where( 'id=5')->save($data); //条件に従って変更したデータを保存 クイッククエリバージョン3.0からクイッククエリメソッドが追加されました。これにより、クエリ条件の記述がさらに簡素化されます。例: 1. 異なるフィールドに同じクエリ条件を実装します$User = M("User"); // User オブジェクトをインスタンス化します$map['name| title'] = 'thinkphp';// クエリ条件はクエリメソッド $User->where($map)->select(); に渡されます クエリ条件は name= になります'thinkphp' OR title = 'thinkphp' 2. 実装 フィールドごとに異なるクエリ条件 $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 スコア > 0 AND title = 'thinkphp' になります
注: ショートカット クエリ メソッドでは、「|」と「&」を同時に使用することはできません。
間隔クエリ
ThinkPHP は、特定のフィールドの間隔クエリをサポートしています。例:
$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)
最後に1 つは AND、OR、または XOR 演算子です。記述されていない場合、デフォルトは AND 演算です。
間隔クエリの条件は、通常のクエリのすべての式をサポートできます。つまり、LIKE、GT、EXP などの式がサポートされます。さらに、間隔クエリでは、1 つのフィールドの条件をまとめて記述できる限り、さらに多くの条件をサポートすることもできます。例:
$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')
組み合わせクエリ
組み合わせ クエリの本体は引き続き配列モードでクエリされますが、文字列モード クエリ (_string)、複合クエリ (_complex)、リクエスト文字列クエリ (_query)、混合クエリの特殊クエリなど、いくつかの特別なクエリ サポートが追加されています。各クエリは 1 つだけ定義できます。配列のインデックス付け方法により、同じインデックスを持つ特殊なクエリは上書きされます。 1. 文字列モードのクエリ (_string をクエリ条件として使用)
配列条件は文字列条件と混合することもできます。例:
$User = M("User") // ユーザー オブジェクトをインスタンス化します
$map ['id '] = array('neq',1);
$map['name'] = 'ok';
$map['_string'] = 'status=1 AND スコア>10';
$User ->where($map)->select();
最後のクエリ条件は次のようになります:
( `id` != 1 ) AND ( `name` = 'ok' ) AND (status=1 AND スコア> ;10)
2. リクエスト文字列クエリメソッド リクエスト文字列クエリは、URL パラメータの受け渡しと同様のメソッドであり、単純な条件の同等性判定をサポートできます。
$map['id'] = array('gt','100');
$map['_query'] = 'status=1&score=100&_logic=or';
取得されるクエリ条件は次のとおりです:
`id`>100 AND (`status` = '1' OR `score` = '100')
3. 複合クエリ 複合クエリは、新しいクエリ条件をカプセル化し、それを元のクエリ条件に組み込むことと同じです。そのため、より複雑なクエリ条件の組み立てを完了できます。
例:
$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' ] = ' (「%thinkphp%」のような名前) OR (「%thinkphp」のようなタイトル) ';
最終的に生成された SQL ステートメントは一貫しています。
統計クエリ
アプリケーションでは、現在のユーザー数 (または特定の条件を満たすユーザー)、全ユーザーの最大ポイント、ユーザーの平均スコアなどの統計データを使用することがよくあります。ThinkPHP は、一連の統計演算を提供します。以下の組み込みメソッド:
メソッド
説明
Count Count カウント、パラメーターはカウントするフィールド名です (オプション)
Max 最大値を取得します、パラメーターはフィールド名ですカウント対象 (必須)
Min 最小値を取得します。パラメータはカウント対象のフィールド名です (必須)
Avg 平均値を取得します、パラメータはカウント対象のフィールド名です (必須)
Sum Get合計スコア、パラメータはカウントするフィールド名です (必須)
使用例:
$User = M("User") // User オブジェクトをインスタンス化します
ユーザー数を取得します:
$ userCount = $User->count();
またはフィールド統計に基づきます:
$userCount = $User->count("id");
ユーザーの最大ポイントを取得します:
$maxScore = $ User->max('score');
ポイントが 0 より大きいユーザーを取得します最小スコア:
$minScore = $User->where('score>0')->min('スコア');
ユーザーの平均スコアを取得します:
$avgScore = $User->avg('score');
ユーザーの合計スコアの統計:
$sumScore = $User->sum( 'score');
そしてすべての統計クエリは一貫した操作の使用をサポートしています。
SQL クエリ
ThinkPHP の組み込み ORM と ActiveRecord モードは便利なデータ アクセス操作を実現し、新バージョンで追加されたコヒーレント操作機能によりこのデータ操作がより明確になりますが、ThinkPHP はネイティブ SQL クエリと実行操作のサポートを引き続き保持しています、複雑なクエリや一部の特殊なデータ操作のニーズを満たすために、SQL クエリの戻り値は、何も処理せずに直接返される Db クラスのクエリ結果です。主に以下の 2 つのメソッドが含まれます:
1. クエリメソッド
SQL クエリ操作を実行します
使用方法 query($sql,$parse=false)
パラメータ sql (必須): 実行する SQL 文クエリ済み
parse (オプション): SQL を解析する必要があるかどうか
戻り値
データが不正またはクエリが間違っている場合は false を返す
それ以外の場合はクエリ結果のデータセットを返す (select メソッドと同じ)
使用例:
$Model = new Model() // どのデータテーブルにも対応しないモデルオブジェクトをインスタンス化します
$Model->query("select * from think_user where status=1 ");
現在分散データベースを使用しており、読み取りと書き込みの分離が設定されている場合、クエリ メソッドは常に読み取りサーバーで実行されるため、SQL ステートメントが何であるかに関係なく、クエリ メソッドは読み取り操作に対応します。 。 2. 実行メソッド
executeは、データのSQL操作の更新と書き込みに使用されます
使用方法execute($sql,$parse=false)
パラメータsql (必須): 実行されるSQL文
parse(オプション): SQL を解析する必要があるかどうか
戻り値 データが不正またはクエリが間違っている場合は、false を返します
それ以外の場合は、影響を受けたレコードの数を返します
使用例:
$Model = new Model() / / モデルオブジェクトのインスタンス化 なし 任意のデータテーブルに対応
$Model->execute("update think_user set name='thinkPHP' where status=1");
現在分散データベースを使用しており、read- を設定している場合書き込み分離、実行メソッド これは常にサーバーに書き込むことによって実行されるため、SQL ステートメントが何であるかに関係なく、実行メソッドは書き込み操作に対応します。
動的クエリ
PHP5 言語の機能を使用して、ThinkPHP はコア モデルの動的クエリ メソッドを次のとおりに実装します。フィールドの値 データをクエリします。 たとえば、getByName、getByEmail
getFieldBy フィールドに基づいてクエリを実行し、特定のフィールドの値を返します。 たとえば、getFieldByName
1. getBy 動的クエリ このクエリ メソッドは、データ テーブルのフィールドをクエリします。たとえば、User オブジェクトには ID、名前、電子メール、アドレスなどの属性があるため、次のクエリ メソッドを使用して、特定の属性に基づいて条件を満たすレコードを直接クエリできます。
$user = $User->getByName('liu21st');
$user = $User->getByEmail('liu21st@gmail.com');
$user = $User->getByAddress( '深セン、中国');
複数のデータフィールドの動的クエリメソッドは一時的にサポートされていません。クエリには find メソッドと select メソッドを使用してください。 2. getFieldBy 動的クエリは、特定のフィールドをクエリし、特定のフィールドの値を返します (例:
)$userId = $User->getFieldByName('liu21st','id');
は、ユーザーの名前に基づいてユーザーの ID 値を取得することを意味します。
サブクエリ
バージョン 3.0 以降、サブクエリのサポートが追加されました。 1. select メソッドを使用します。 select メソッドのパラメータが false の場合、クエリは実行されません。構築された SQL のみが返されます。例:
// 最初にサブクエリ SQL を構築します
$subQuery = $model->field('id,name')->table('tablename')-> group('field')->where ($where)->order('status')->select(false);
select メソッドが false パラメータを渡す場合、現在のクエリは実行されませんが、クエリ SQL のみが生成されます。 2. buildSql メソッドを使用します
$subQuery = $model->field('id,name')->table('tablename')->group('field')->where($where) - >order('status')->buildSql();
buildSql メソッドの呼び出し後、実際のクエリ操作は実行されず、クエリの SQL ステートメントのみが生成されます (混乱を避けるため) 、括弧が SQL の両側に追加されます)、後続のクエリで直接呼び出します。
// サブクエリを使用したクエリ
$model->table($subQuery.' a')->where()->order()->select()
構築されたサブクエリ SQL 継続操作メソッドが利用可能ThinkPHP の場合、table where など。
概要
この記事は主に、単純なクエリ、式クエリ、クイック クエリ、間隔クエリ、統計クエリ、サブクエリ操作の実行方法など、データのクエリ方法を理解するのに役立ちます。コヒーレント操作を使用して、より複雑な CURD 操作を実行する方法については、後で詳しく学習します。
上記は ThinkPHP3.1 クイックスタート (3) クエリ言語の内容です。その他の関連コンテンツについては、PHP 中国語 Web サイト (www.php.cn) をご覧ください。