ホームページ バックエンド開発 PHPチュートリアル ThinkPHP3.1 クエリ言語詳細解説_PHPチュートリアル

ThinkPHP3.1 クエリ言語詳細解説_PHPチュートリアル

Jul 13, 2016 am 10:24 AM

ThinkPHP のクエリ言語は、一貫した操作と組み合わせることで、複雑なビジネス ロジックの要件を効果的に解決できます。この記事では、まずフレームワークのクエリ言語について詳しく理解します。

1. クエリ言語の概要

ThinkPHP には、データ クエリ操作を迅速に実行できる非常に柔軟なクエリ メソッドが組み込まれており、クエリ条件は主に where メソッドなどの一貫した操作に使用できます。ほぼ同じクエリ メソッド (Mongo などの一部のデータベースには異なる式クエリがあります) を使用すると、システムは異なるデータベースの違いを解決するのに役立つため、フレームワークのこのクエリ メソッドをクエリ言語と呼びます。クエリ言語は、ThinkPHP フレームワークの ORM のハイライトでもあり、クエリ操作をよりシンプルかつ理解しやすくします。クエリ言語の意味を一つずつ説明しましょう。

2.お問い合わせ方法

ThinkPHP はクエリ条件として文字列の直接使用をサポートできますが、ほとんどの場合、より安全であるため、インデックス配列またはオブジェクトをクエリ条件として使用することをお勧めします。

1. クエリ条件として文字列を使用します

これは最も伝統的な方法ですが、あまり安全ではありません。例:

リーリー

最終的に生成された SQL ステートメントは

リーリー

文字列クエリを使用する場合、新しいバージョンで提供される文字列条件のセキュリティ前処理メカニズムを使用できますが、今は詳しく説明しません。

2. クエリ条件として配列を使用します

このメソッドは、最も一般的に使用されるクエリメソッドです。例:

リーリー

最終的に生成された SQL ステートメントは

リーリー

複数フィールドのクエリを実行する場合、フィールド間のデフォルトの論理関係は論理 AND ですが、_logic を使用してクエリ ロジックを定義することで、次のルールを使用してデフォルトの論理判断を変更できます。

リーリー
最終的に生成された SQL ステートメントは

リーリー

3. オブジェクトメソッドを使用してクエリを実行します

これは stdClass 組み込みオブジェクトの例です:

リーリー
最終的に生成される SQL ステートメントは上記と同じです

リーリー
オブジェクト モードを使用したクエリと配列を使用したクエリの効果は同じであり、ほとんどの場合、効率を高めるために配列モードを使用することをお勧めします。

3. 式クエリ

上記のクエリ条件は単純な等価性判定にすぎません。クエリ式は、ThinkPHP クエリ言語の本質でもある、より多くの SQL クエリ構文をサポートするために使用できます。

リーリー

式では大文字と小文字が区別されません。サポートされているクエリ式は次のとおりです。それぞれの意味は次のとおりです。


に等しい と等しくありません
表現 意味
EQ は(=)
NEQ は (<>)
GT (>)より大きい
EGT 以上 (>=)
LT (<)未満
エルト 以下 (<=)
いいね あいまいクエリ
[ない]間 (not) 間隔クエリ
[ない]入っています (含まれていない)INクエリ
経験値 式クエリ、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_LIKE_FIELDS参数的话,某些字段也会自动进行模糊查询。例如设置了:

'DB_LIKE_FIELDS'=>'title|content'

ログイン後にコピー

的话,使用

$map['title'] = 'thinkphp';

ログイン後にコピー

查询条件就会变成 title 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); // 根据条件保存修改的数据
ログイン後にコピー


4.快捷查询

从3.0版本开始,增加了快捷查询方式,可以进一步简化查询条件的写法,例如:

一、实现不同字段相同的查询条件

$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'
ログイン後にコピー

注意:快捷查询方式中“|”和“&”不能同时使用。

5.区间查询

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)
最后一个可以是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')
ログイン後にコピー


6.组合查询

组合查询的主体还是采用数组方式查询,只是加入了一些特殊的查询支持,包括字符串模式查询(_string)、复合查询(_complex)、请求字符串查询(_query),混合查询中的特殊查询每次查询只能定义一个,由于采用数组的索引方式,索引相同的特殊查询会被覆盖。

一、字符串模式查询(采用_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 ステートメントは一貫しています。

7. 統計クエリ

アプリケーションでは、現在のユーザー数 (または特定の条件を満たすユーザー)、全ユーザーの最大ポイント、ユーザーの平均スコアなどの統計データを使用することがよくあります。ThinkPHP は、一連の統計演算を提供します。これらの組み込みメソッドには以下が含まれます:

方法 手順
カウント 数量をカウントします。パラメータはカウントするフィールド名です(オプション)
マックス 最大値を取得します。パラメータはカウントするフィールド名です(必須)
最小値を取得します。パラメータはカウントするフィールド名です(必須)
平均 平均値を取得します。パラメータはカウントするフィールド名です(必須)
合計 合計スコアを取得します。パラメータはカウントするフィールド名です(必須)

用法示例:

$User = M("User"); // 实例化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');
ログイン後にコピー

并且所有的统计查询均支持连贯操作的使用。

8.SQL查询

ThinkPHP内置的ORM和ActiveRecord模式实现了方便的数据存取操作,而且新版增加的连贯操作功能更是让这个数据操作更加清晰,但是ThinkPHP仍然保留了原生的SQL查询和执行操作支持,为了满足复杂查询的需要和一些特殊的数据操作,SQL查询的返回值因为是直接返回的Db类的查询结果,没有做任何的处理。主要包括下面两个方法:

一、query方法

query 执行SQL查询操作
用法 query($sql,$parse=false)
参数 sql(必须):要查询的SQL语句
parse(可选):是否需要解析SQL
返回值

如果数据非法或者查询错误则返回false


否则返回查询结果数据集(同select方法)

使用示例:

$Model = new Model() // 实例化一个model对象 没有对应任何数据表
$Model->query("select * from think_user where status=1");
ログイン後にコピー

如果你当前采用了分布式数据库,并且设置了读写分离的话,query方法始终是在读服务器执行,因此query方法对应的都是读操作,而不管你的SQL语句是什么。
二、execute方法

execute用于更新和写入数据的sql操作
用法 execute($sql,$parse=false)
参数 sql(必须):要执行的SQL语句
parse(可选):是否需要解析SQL
返回值 如果数据非法或者查询错误则返回false
否则返回影响的记录数

使用示例:

$Model = new Model() // 实例化一个model对象 没有对应任何数据表
$Model->execute("update think_user set name='thinkPHP' where status=1");
ログイン後にコピー

如果你当前采用了分布式数据库,并且设置了读写分离的话,execute方法始终是在写服务器执行,因此execute方法对应的都是写操作,而不管你的SQL语句是什么。

9.动态查询

借助PHP5语言的特性,ThinkPHP实现了动态查询,核心模型的动态查询方法包括下面几种:


方法名 说明 举例
getBy 根据字段的值查询数据 例如,getByName,getByEmail
getFieldBy 根据字段查询并返回某个字段的值 例如,getFieldByName
一、getBy动态查询

该查询方式针对数据表的字段进行查询。例如,User对象拥有id,name,email,address 等属性,那么我们就可以使用下面的查询方法来直接根据某个属性来查询符合条件的记录。

$user = $User->getByName('liu21st');
$user = $User->getByEmail('liu21st@gmail.com');
$user = $User->getByAddress('中国深圳');
ログイン後にコピー

暂时不支持多数据字段的动态查询方法,请使用find方法和select方法进行查询。

二、getFieldBy动态查询

针对某个字段查询并返回某个字段的值,例如

$userId = $User->getFieldByName('liu21st','id');
ログイン後にコピー

表示根据用户的name获取用户的id值。

10.子查询

从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等。

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/825431.htmlTechArticleThinkPHP的查询语言配合连贯操作可以很好解决复杂的业务逻辑需求,本篇我们就首先来深入了解下框架的查询语言。 1.查询语言介绍 ThinkP...
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

PHPのさまざまなエラータイプを説明します(通知、警告、致命的なエラー、解析エラー)。 PHPのさまざまなエラータイプを説明します(通知、警告、致命的なエラー、解析エラー)。 Apr 08, 2025 am 12:03 AM

PHPには4つの主要なエラータイプがあります。1。notice:わずかなものは、未定義の変数へのアクセスなど、プログラムを中断しません。 2。警告:通知よりも深刻で、ファイルを含むなど、プログラムを終了しません。 3。ファタラー:最も深刻なのは、機能を呼び出すなど、プログラムを終了します。 4。ParseError:構文エラーは、エンドタグの追加を忘れるなど、プログラムの実行を防ぎます。

PHPとPython:2つの一般的なプログラミング言語を比較します PHPとPython:2つの一般的なプログラミング言語を比較します Apr 14, 2025 am 12:13 AM

PHPとPythonにはそれぞれ独自の利点があり、プロジェクトの要件に従って選択します。 1.PHPは、特にWebサイトの迅速な開発とメンテナンスに適しています。 2。Pythonは、データサイエンス、機械学習、人工知能に適しており、簡潔な構文を備えており、初心者に適しています。

PHPでの安全なパスワードハッシュ(例:Password_hash、password_verify)を説明します。 MD5またはSHA1を使用してみませんか? PHPでの安全なパスワードハッシュ(例:Password_hash、password_verify)を説明します。 MD5またはSHA1を使用してみませんか? Apr 17, 2025 am 12:06 AM

PHPでは、Password_hashとpassword_verify関数を使用して安全なパスワードハッシュを実装する必要があり、MD5またはSHA1を使用しないでください。 1)password_hashセキュリティを強化するために、塩値を含むハッシュを生成します。 2)password_verifyハッシュ値を比較して、パスワードを確認し、セキュリティを確保します。 3)MD5とSHA1は脆弱であり、塩の値が不足しており、最新のパスワードセキュリティには適していません。

アクション中のPHP:実際の例とアプリケーション アクション中のPHP:実際の例とアプリケーション Apr 14, 2025 am 12:19 AM

PHPは、電子商取引、コンテンツ管理システム、API開発で広く使用されています。 1)eコマース:ショッピングカート機能と支払い処理に使用。 2)コンテンツ管理システム:動的コンテンツの生成とユーザー管理に使用されます。 3)API開発:RESTFUL API開発とAPIセキュリティに使用されます。パフォーマンスの最適化とベストプラクティスを通じて、PHPアプリケーションの効率と保守性が向上します。

HTTPリクエストメソッド(取得、投稿、配置、削除など)とは何ですか?それぞれを使用する必要がありますか? HTTPリクエストメソッド(取得、投稿、配置、削除など)とは何ですか?それぞれを使用する必要がありますか? Apr 09, 2025 am 12:09 AM

HTTPリクエストメソッドには、それぞれリソースを取得、送信、更新、削除するために使用されるGET、POST、PUT、および削除が含まれます。 1. GETメソッドは、リソースを取得するために使用され、読み取り操作に適しています。 2. POSTメソッドはデータの送信に使用され、新しいリソースを作成するためによく使用されます。 3. PUTメソッドは、リソースの更新に使用され、完全な更新に適しています。 4.削除メソッドは、リソースの削除に使用され、削除操作に適しています。

PHP:Web開発の重要な言語 PHP:Web開発の重要な言語 Apr 13, 2025 am 12:08 AM

PHPは、サーバー側で広く使用されているスクリプト言語で、特にWeb開発に適しています。 1.PHPは、HTMLを埋め込み、HTTP要求と応答を処理し、さまざまなデータベースをサポートできます。 2.PHPは、ダイナミックWebコンテンツ、プロセスフォームデータ、アクセスデータベースなどを生成するために使用され、強力なコミュニティサポートとオープンソースリソースを備えています。 3。PHPは解釈された言語であり、実行プロセスには語彙分析、文法分析、編集、実行が含まれます。 4.PHPは、ユーザー登録システムなどの高度なアプリケーションについてMySQLと組み合わせることができます。 5。PHPをデバッグするときは、error_reporting()やvar_dump()などの関数を使用できます。 6. PHPコードを最適化して、キャッシュメカニズムを使用し、データベースクエリを最適化し、組み込み関数を使用します。 7

PHPは、ファイルを安全に処理する方法をどのように処理しますか? PHPは、ファイルを安全に処理する方法をどのように処理しますか? Apr 10, 2025 am 09:37 AM

PHPは、$ \ _ファイル変数を介してファイルのアップロードを処理します。セキュリティを確保するための方法には次のものが含まれます。1。アップロードエラー、2。ファイルの種類とサイズを確認する、3。ファイル上書きを防ぐ、4。ファイルを永続的なストレージの場所に移動します。

PHP OOPで、self ::、parent ::、and static ::の違いを説明します。 PHP OOPで、self ::、parent ::、and static ::の違いを説明します。 Apr 09, 2025 am 12:04 AM

Phpoopでは、self ::は現在のクラスを指し、親::は親クラスを指し、静的::は後期静的結合に使用されます。 1.Self ::静的方法と一定の呼び出しに使用されますが、後期静的結合をサポートしていません。 2.Parent ::サブクラスには、親クラスのメソッドを呼び出すために使用され、プライベートメソッドにアクセスできません。 3.Static ::継承と多型に適した後期静的結合をサポートしますが、コードの読みやすさに影響を与える可能性があります。

See all articles