前回の記事では、基本的なデータ 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") // ユーザーオブジェクトをインスタンス化します-
$condition['name'] = 'thinkphp';-
$condition['ステータス'] = 1;-
// クエリ条件をクエリメソッドに渡します -
$User->where($condition)->select();
-
最終的に生成された SQL ステートメントは
です。
SELECT * FROM think_user WHERE `name`='thinkphp' AND status=1
-
複数フィールドのクエリを実行する場合、フィールド間のデフォルトの論理関係は論理 AND ですが、_logic を使用してクエリ ロジックを定義することにより、デフォルトの論理判断を次のルールを使用して変更できます:
$User = M("User") // ユーザーオブジェクトをインスタンス化します
-
$condition['name'] = 'thinkphp';
-
$condition['account'] = 'thinkphp';
-
$condition['_logic'] = 'OR';
-
// クエリ条件をクエリメソッドに渡します
-
$User->where($condition)->select();
-
最終的に生成された SQL ステートメントは
です。
SELECT * FROM think_user WHERE `name`='thinkphp' OR `account`='thinkphp'
-
3. オブジェクト メソッドを使用してクエリを実行します。 ここでは、stdClass 組み込みオブジェクトを例として取り上げます。
$User = M("User") // ユーザーオブジェクトをインスタンス化します
// クエリ条件を定義します
-
$condition = 新しい stdClass();
$condition->name = 'thinkphp' -
$条件->ステータス= 1;
-
$User->where($condition)->select();
-
最終的に生成される SQL ステートメントは上記と同じです
-
SELECT * FROM think_user WHERE `name`='thinkphp' AND status=1-
オブジェクト モード クエリと配列モード クエリの使用の効果は同じであり、ほとんどの場合、より効率的に配列モードを使用することをお勧めします。
-
式クエリ
上記のクエリ条件は、単純な等価性の判断にすぎません。クエリ式は、ThinkPHP クエリ言語の本質でもある、より多くの SQL クエリ構文をサポートするために使用できます。クエリ式の形式は次のとおりです。 $map['フィールド名'] = 配列。 ( 'expression','querycondition'); 式では大文字と小文字が区別されません。次のクエリ式がサポートされており、それぞれの意味は次のとおりです。
表达式 |
含义 |
EQ |
等于(=) |
NEQ |
不等于(<>) |
GT |
大于(>) |
EGT |
大于等于(>=) |
LT |
小于(<) |
ELT |
小于等于(<=) |
LIKE |
模糊查询 |
[NOT] BETWEEN |
(不在)区间查询 |
[NOT] IN |
(不在)IN 查询 |
EXP |
表达式查询,支持SQL语法 |
例は次のとおりです: EQ: 等しい (=)
例:
-
$map['id'] = array('eq',100);
次のクエリと同等です
-
$map['id'] = 100;
表されるクエリ条件は、id = 100NEQ: not equal to (<>)
です。
例:
-
$map['id'] = array('neq',100);
表現されるクエリ条件は id 100GT: より大きい (>)
例:
-
$map['id'] = array('gt',100);
表現されるクエリ条件は id > 100EGT: 以上 (>=)
例:
-
$map['id'] = array('egt',100);
表されるクエリ条件は、id >= 100LT: 未満 ( です。
例:
-
$map['id'] = array('lt',100);
表されるクエリ条件は id
例:
-
$map['id'] = array('elt',100);
表現されるクエリ条件は id と同じです。
例:
-
$map['name'] = array('like','thinkphp%');
クエリ条件は「thinkphp%」のような名前になります
DB_LIKE_FIELDS パラメータが設定されている場合、一部のフィールドではファジー クエリも自動的に実行されます。たとえば、次のように設定します:
-
'DB_LIKE_FIELDS'=>'タイトルコンテンツ'
その場合は、
を使用してください
-
$map['title'] = 'thinkphp';
クエリ条件は「%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 like '%thinkphp%' AND b 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('入っていない','1,5,8');
以下と同等:
-
$map['id'] = array('入っていない',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") // ユーザーオブジェクトをインスタンス化します
-
// 変更するデータオブジェクトの属性の割り当て
-
$data['name'] = 'ThinkPHP';
-
$data['score'] = array('exp','score+1');//ユーザーのポイントが 1 増加します
-
$User->where('id=5')->save($data) // 条件に従って変更したデータを保存します
クイッククエリ
バージョン 3.0 からは、ショートカット クエリ メソッドが追加されました。これにより、クエリ条件の記述がさらに簡素化されます。例: 1. 異なるフィールドに同じクエリ条件を実装します
-
$User = M("User") // ユーザーオブジェクトをインスタンス化します
-
$map['nametitle'] = 'thinkphp';
-
// クエリ条件をクエリメソッドに渡します
-
$User->where($map)->select();
クエリ条件は
になります
名前 = 'thinkphp' または タイトル = 'thinkphp'-
2. 異なるフィールドに異なるクエリ条件を実装します
-
$User = M("User") // ユーザーオブジェクトをインスタンス化します
-
$map['status&title'] =array('1','thinkphp','_multi'=>true);
-
// クエリ条件をクエリメソッドに渡します
-
$User->where($map)->select();
'_multi'=>true を配列の最後に追加する必要があります。これは、現在複数の条件に一致していることを示し、クエリ条件は
になります。
ステータス = 1 AND タイトル = 'thinkphp'-
、クエリフィールドはさらに多くをサポートします。例:
$map['status&score&title'] =array('1',array('gt','0'),'thinkphp','_multi'=>true);-
クエリ条件は
になります
ステータス = 1 AND スコア > 0 AND タイトル = 'thinkphp'-
注: ショートカット クエリ メソッドでは、「"」と「&」を同時に使用することはできません。
間隔クエリ
ThinkPHP は、特定のフィールドに対する間隔クエリをサポートしています。例:
$map['id'] = array(array('gt',1),array('lt',10)) ;-
取得したクエリ条件は次のとおりです:
(`id` > 1) AND (`id`
$map['id'] = array(array('gt',3),array('lt',10), 'or') ;-
取得されるクエリ条件は: (`id` > 3) OR (`id`
$map['id'] = array(array('neq',6),array('gt',3),'and');
-
取得したクエリ条件は: (`id` != 6) AND (`id` > 3)
最後の演算子は、AND、OR、または XOR 演算子にすることができます。記述されていない場合、デフォルトは AND 演算です。
間隔クエリの条件は、通常のクエリのすべての式をサポートできます。つまり、LIKE、GT、EXP などの式がサポートされます。さらに、間隔クエリでは、1 つのフィールドの条件をまとめて記述できる限り、より多くの条件もサポートできます。たとえば、
。
$map['name'] = array(array('like','%a%'), array('like','%b%'), array('like','%c%'), ' ThinkPHP'、'または');
-
最後のクエリ条件は次のとおりです:
(`name` LIKE '%a%') OR (`name` LIKE '%b%') OR (`name` LIKE '%c%') OR (`name` = 'ThinkPHP')
-
結合クエリ
結合クエリの本体では引き続き配列クエリが使用されますが、文字列モード クエリ (_string)、複合クエリ (_complex)、要求文字列クエリ (_query)、および混合クエリそれぞれの特別なクエリなど、いくつかの特別なクエリのサポートが追加されています。 time クエリは 1 つだけ定義できます。配列のインデックス付け方法により、同じインデックスを持つ特殊なクエリは上書きされます。 1. 文字列モードクエリ (_string をクエリ条件として使用)
配列条件は文字列条件と混合することもできます。例:
$User = M("User") // ユーザーオブジェクトをインスタンス化します
-
$map['id'] = array('neq',1);
-
$map['name'] = 'ok';
-
$map['_string'] = 'ステータス=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'] = 'または';-
$map['_complex'] = $where;-
$map['id'] = array('gt',1);-
-
クエリ条件は
です
-
( id > 1) AND ( ( '%thinkphp%' のような名前) OR ( '%thinkphp%' のようなタイトル) )
複合クエリでは、_complex をサブクエリ条件として使用して定義します。以前のクエリ方法を使用すると、より複雑なクエリ条件を非常に柔軟に作成できます。
多くのクエリ メソッドは相互に変換できます。たとえば、上記のクエリ条件は次のように変更できます。
$where['id'] = array('gt',1);-
$where['_string'] = ' (「%thinkphp%」のような名前) OR (「%thinkphp」のようなタイトル) ';-
最終的に生成された SQL ステートメントは一貫しています。
統計クエリ
アプリケーションでは、現在のユーザー (または特定の条件を満たすユーザー) の数、全ユーザーの最大ポイント、ユーザーの平均スコアなどの統計を使用することがよくあります。ThinkPHP は、次のような一連の組み込み関数を提供します。これらの統計演算には次のようなメソッドが含まれます:
方法 |
说明 |
Count |
统计数量,参数是要统计的字段名(可选) |
Max |
获取最大值,参数是要统计的字段名(必须) |
Min |
获取最小值,参数是要统计的字段名(必须) |
Avg |
获取平均值,参数是要统计的字段名(必须) |
Sum |
获取总分,参数是要统计的字段名(必须) |
使用例:
$User = M("User") // ユーザーオブジェクトをインスタンス化します-
ユーザー数を取得します:
$userCount = $User->count();-
またはフィールドに基づく統計:
$userCount = $User->count("id");-
ユーザーの最大ポイントを取得します:
$maxScore = $User->max('score');-
ポイントが 0 より大きいユーザーの最小ポイントを取得します:
$minScore = $User->where('score>0')->min('score');-
ユーザーの平均ポイントを取得します:
$avgScore = $User->avg('score');-
ユーザーの合計スコアの統計:
$sumScore = $User->sum('score');-
また、すべての統計クエリは一貫した操作の使用をサポートしています。
SQLクエリ
ThinkPHP の組み込み ORM および ActiveRecord モードにより、便利なデータ アクセス操作が可能になり、新しいバージョンで追加されたコヒーレント操作機能により、このデータ操作がより明確になります。ただし、複雑なクエリのニーズを満たすために、ThinkPHP は引き続きネイティブ SQL クエリと実行操作のサポートを維持します。一部の特殊なデータ操作では、SQL クエリの戻り値が何も処理されずに、Db クラスのクエリ結果として直接返されます。主に次の 2 つのメソッドが含まれます:
1. クエリメソッド
query SQL クエリ操作を実行します
使用法 |
クエリ($sql,$parse=false) |
パラメータ |
sql (必須): クエリされる SQL ステートメント
parse (オプション): SQL を解析する必要があるかどうか |
戻り値 |
query 执行SQL查询操作 |
用法 |
query($sql,$parse=false) |
参数 |
sql(必须):要查询的SQL语句
parse(可选):是否需要解析SQL |
返回值 |
如果数据非法或者查询错误则返回false
否则返回查询结果数据集(同select方法)
|
データが不正であるか、クエリが間違っている場合は false が返されます
それ以外の場合は、クエリ結果データセットを返します (select メソッドと同じ)
|
テーブル>
-
使用例:
-
$Model = new Model() // どのデータテーブルにも対応しないモデルオブジェクトをインスタンス化します
$Model->query("select * from think_user where status=1");
execute用于更新和写入数据的sql操作 |
用法 |
execute($sql,$parse=false) |
参数 |
sql(必须):要执行的SQL语句
parse(可选):是否需要解析SQL |
返回值 |
如果数据非法或者查询错误则返回false
否则返回影响的记录数 |
現在分散データベースを使用しており、読み取りと書き込みの分離を設定している場合、クエリ メソッドは常に読み取りサーバーで実行されるため、SQL ステートメントが何であるかに関係なく、クエリ メソッドは読み取り操作に対応します。 2. メソッド を実行します
データの更新と書き込みのための SQL 操作を実行します
使用法 |
実行($sql,$parse=false) |
パラメータ |
sql (必須): 実行される SQL ステートメント
parse (オプション): SQL を解析する必要があるかどうか |
戻り値 |
データが不正であるかクエリが間違っている場合は false が返されます
それ以外の場合は、影響を受けるレコードの数を返します |
テーブル>
使用例:
-
$Model = new Model() // どのデータテーブルにも対応しないモデルオブジェクトをインスタンス化します
-
$Model->execute("update think_user set name='thinkPHP' where status=1");
現在分散データベースを使用しており、読み取りと書き込みの分離を設定している場合、実行メソッドは常に書き込みサーバーで実行されるため、SQL ステートメントが何であるかに関係なく、実行メソッドは書き込み操作に対応します。
動的クエリ
PHP5 言語の特性を利用して、ThinkPHP は動的クエリを実装します。コア モデルの動的クエリ メソッドには次のものが含まれます。
方法名 |
说明 |
举例 |
getBy |
根据字段的值查询数据 |
例如,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 は、テーブル where などの ThinkPHP の一貫した操作メソッドで使用できます。
概要
この記事は主に、単純なクエリ、式クエリ、クイック クエリ、間隔クエリ、統計クエリなどのデータ クエリの方法、およびサブクエリ操作の実行方法を理解するのに役立ちます。コヒーレント操作を使用して、より複雑な CURD 操作を実行する方法については、後で詳しく学習します。