ThinkPHP データベース操作ビュー クエリ、サブクエリ、ネイティブ クエリ

藏色散人
リリース: 2021-02-03 18:48:56
転載
3235 人が閲覧しました

thinkphp の次のチュートリアル コラムでは、ThinkPHP データベース操作のビュー クエリ、サブクエリ、およびネイティブ クエリについて紹介します。

ビュー クエリ

ビュー クエリは、データベース ビューに依存せず、データベースがビューをサポートする必要のない複数テーブル クエリを実装できます。例:

Db::view('User','id,name')
    ->view('Profile','truename,phone,email','Profile.user_id=User.id')
    ->view('Score','score','Score.user_id=Profile.id')
    ->where('score','>',80)
    ->select();
ログイン後にコピー

生成される SQL ステートメントは次のようになります:

SELECT User.id,User.name,Profile.truename,Profile.phone,Profile.email,Score.score 
FROM think_user User 
INNER JOIN think_profile Profile ON Profile.user_id=User.id 
INNER JOIN think_socre Score ON Score.user_id=Profile.id 
WHERE Score.score > 80
ログイン後にコピー

ビュー クエリではテーブル メソッドと結合メソッドを呼び出す必要はなく、フィールド名のみを呼び出す必要があることに注意してください。 where メソッドと order メソッドを呼び出すときに使用する必要があるため、テーブル名を追加します。

INNER 結合クエリはデフォルトで使用されます。変更する必要がある場合は、次のように使用できます:

Db::view('User','id,name')
    ->view('Profile','truename,phone,email','Profile.user_id=User.id','LEFT')
    ->view('Score','score','Score.user_id=Profile.id','RIGHT')
    ->where('score','>',80)
    ->select();
ログイン後にコピー

生成される SQL ステートメントは次のようになります:

SELECT User.id,User.name,Profile.truename,Profile.phone,Profile.email,Score.score 
FROM think_user User 
LEFT JOIN think_profile Profile ON Profile.user_id=User.id 
RIGHT JOIN think_socre Score ON Score.user_id=Profile.id 
WHERE Score.score > 80
ログイン後にコピー

エイリアスを使用できます。

Db::view('User',['id'=>'uid','name'=>'account'])
    ->view('Profile','truename,phone,email','Profile.user_id=User.id')
    ->view('Score','score','Score.user_id=Profile.id')
    ->where('score','>',80)
    ->select();
ログイン後にコピー

生成される SQL ステートメントは次のようになります。

SELECT User.id AS uid,User.name AS account,Profile.truename,Profile.phone,Profile.email,Score.score 
FROM think_user User 
INNER JOIN think_profile Profile ON Profile.user_id=User.id 
INNER JOIN think_socre Score ON Score.user_id=Profile.id 
WHERE Score.score > 80
ログイン後にコピー

配列を使用してテーブル名とエイリアスを定義できます。たとえば、次のようになります。

Db::view(['think_user'=>'member'],['id'=>'uid','name'=>'account'])
    ->view('Profile','truename,phone,email','Profile.user_id=member.id')
    ->view('Score','score','Score.user_id=Profile.id')
    ->where('score','>',80)
    ->select();
ログイン後にコピー

生成される SQLステートメントは次のようになります:

SELECT member.id AS uid,member.name AS account,Profile.truename,Profile.phone,Profile.email,Score.score 
FROM think_user member 
INNER JOIN think_profile Profile ON Profile.user_id=member.id 
INNER JOIN think_socre Score ON Score.user_id=Profile.id 
WHERE Score.score > 80
ログイン後にコピー

Subquery

最初にサブクエリ SQL を構築します。構築するには次の 3 つの方法を使用できます。サブクエリ。

1. select メソッドを使用します

select メソッドのパラメータが false の場合、それはノーを意味します。クエリが実行されます。構築された SQL を返します。例:

$subQuery = Db::table('think_user')    
->field('id,name')    
->where('id','>',10)    
->select(false);
ログイン後にコピー

生成されたサブクエリ結果は次のとおりです:

SELECT `id`,`name` FROM `think_user` WHERE `id` > 10
ログイン後にコピー
ログイン後にコピー

2。fetchSql メソッドを使用します

fetchSql メソッドは、クエリを実行せず、構築された SQL ステートメントを返すだけであることを意味し、選択だけでなくすべての CURD クエリもサポートします。

$subQuery = Db::table('think_user')    
->field('id,name')    
->where('id','>',10)    
->fetchSql(true)    
->select();
ログイン後にコピー

生成されたサブクエリの結果は次のとおりです:

SELECT `id`,`name` FROM `think_user` WHERE `id` > 10
ログイン後にコピー
ログイン後にコピー

3. buildSql を使用してサブクエリを構築します

$subQuery = Db::table('think_user')    
->field('id,name')    
->where('id','>',10)    
->buildSql();
ログイン後にコピー

生成されたサブクエリの結果は次のとおりです:

( SELECT `id`,`name` FROM `think_user` WHERE `id` > 10 )
ログイン後にコピー

buildSql メソッドを呼び出した後、実際のクエリ操作は実行されませんが、クエリの SQL ステートメントのみが生成されます (混乱を避けるため、括弧内はSQL の両側に追加されます)、後続のクエリで直接呼び出します。

最初の 2 つの方法を使用する場合は、自分で「括弧」を追加する必要があることに注意してください。

次に、サブクエリを使用して新しいクエリを作成します:

Db::table($subQuery.' a')    
->where('a.name','like','thinkphp')    
->order('id','desc')    
->select();
ログイン後にコピー

生成される SQL ステートメントは次のとおりです:

SELECT * FROM ( SELECT `id`,`name` FROM `think_user` WHERE `id` > 10 ) a WHERE a.name LIKE 'thinkphp' ORDER BY `id` desc
ログイン後にコピー

##4. クロージャを使用してサブクエリを構築する IN/NOT IN や EXISTS/NOT EXISTS などのクエリでは、クロージャをサブクエリとして直接使用できます。次に例を示します。

Db::table('think_user')    
->where('id','IN',function($query){        
$query->table('think_profile')->where('status',1)->field('id');
    })    
    ->select();
ログイン後にコピー

生成された SQL ステートメントは

#
SELECT * FROM `think_user` WHERE `id` IN ( SELECT `id` FROM `think_profile` WHERE `status` = 1 )
ログイン後にコピー
Db::table('think_user')    
->where(function($query){        
$query->table('think_profile')->where('status',1);
    },'exists')    
    ->find();
ログイン後にコピー

生成された SQL ステートメントは

#
SELECT * FROM `think_user` WHERE EXISTS ( SELECT * FROM `think_profile` WHERE `status`= 1 )
ログイン後にコピー

ネイティブ クエリ #Db クラスは、主に次の 2 つのメソッドを含むネイティブ SQL クエリ操作をサポートします。

##クエリ メソッド

##query メソッドは、SQL クエリ操作を実行するために使用されます。データが不正であるかクエリが間違っている場合は false を返し、それ以外の場合はクエリ結果のデータ セットを返します (select メソッドと同じ)。 使用例:

Db::query("select * from think_user where status=1");
ログイン後にコピー

現在分散データベースを使用しており、読み取りと書き込みの分離を設定している場合、クエリメソッドは常に読み取りサーバーで実行されるため、クエリメソッドは対応しますSQL ステートメントが何であるかに関係なく、これは読み取り操作です。

execute メソッド

execute は、データが次の場合、データ SQL 操作の更新と書き込みに使用されます。不正 または、クエリ エラーがある場合は false が返され、それ以外の場合は影響を受けたレコードの数が返されます。 使用例:

Db::execute("update think_user set name='thinkphp' where status=1");
ログイン後にコピー

現在分散データベースを使用しており、読み取りと書き込みの分離を設定している場合、execute メソッドは常に書き込みサーバーで実行されるため、execute メソッドが対応しますSQL ステートメントが何であるかに関係なく、これらはすべて書き込み操作です。

#パラメータ バインディング

#疑問符プレースホルダまたは名前付きプレースホルダを含む、ネイティブ クエリ中のパラメータ バインディングをサポートします。例:

Db::query("select * from think_user where id=? AND status=?",[8,1]);
// 命名绑定
Db::execute("update think_user set name=:name where status=:status",['name'=>'thinkphp','status'=>1]);
ログイン後にコピー

以上がThinkPHP データベース操作ビュー クエリ、サブクエリ、ネイティブ クエリの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:cnblogs.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート