高度なクエリ (クエリ ビルダー 9)


クイック クエリ

ショートカット クエリ方法は、複数のフィールドに同じクエリ条件を記述する簡略化された方法であり、方法をさらに簡素化できます。クエリ条件の記述方法。複数のフィールドは、OR クエリを表す場合は | で区切られ、AND クエリを表す場合は & で区切られます。たとえば、次のクエリを実装できます:

Db::table('think_user')
    ->where('name|title','like','thinkphp%')
    ->where('create_time&update_time','>',0)
    ->find();

生成されるクエリ SQL は次のとおりです:

SELECT * FROM `think_user` WHERE ( `name` LIKE 'thinkphp%' OR `title` LIKE 'thinkphp%' ) AND ( `create_time` > 0 AND `update_time` > 0 ) LIMIT 1

クイック クエリ サポート すべてのクエリ式。

バッチ (フィールド) クエリ

複数の条件を使用してバッチ条件付きクエリを定義できます。例:

Db::table('think_user')
    ->where([
        ['name', 'like', 'thinkphp%'],
        ['title', 'like', '%thinkphp'],
        ['id', '>', 0],
        ['status', '=', 1],
    ])
    ->select();

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

SELECT * FROM `think_user` WHERE `name` LIKE 'thinkphp%' AND `title` LIKE '%thinkphp' AND `id` > 0 AND `status` = '1'

配列モードで exp クエリを使用する場合は、raw メソッドを使用する必要があります。

Db::table('think_user')
    ->where([
        ['name', 'like', 'thinkphp%'],
        ['title', 'like', '%thinkphp'],
        ['id', 'exp', Db::raw('>score')],
        ['status', '=', 1],
    ])
    ->select();

配列クエリ メソッドでは、クエリ配列がユーザーが送信したデータによって制御できないことを確認してください。ユーザーが送信したフォーム データは、次のようにクエリ配列の要素として渡す必要があります:

Db::table('think_user')
    ->where([
        ['name', 'like', $name . '%'],
        ['title', 'like', '%' . $title],
        ['id', '>', $id],
        ['status', '=', $status],
    ])
    ->select();

注、同じフィールドに対する複数のクエリ条件はマージされる場合があります。特定の where メソッドの条件を個別に処理したい場合は、次の方法を使用して他の条件の影響を避けることができます。

$map = [
        ['name', 'like', 'thinkphp%'],
        ['title', 'like', '%thinkphp'],
        ['id', '>', 0],
    ];
Db::table('think_user')
    ->where([ $map ])
    ->where('status',1)
    ->select();

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

SELECT * FROM `think_user` WHERE ( `name` LIKE 'thinkphp%' AND `title` LIKE '%thinkphp' AND `id` > 0 ) AND `status` = '1'

多次元配列クエリを活用すると、さまざまな複雑な SQL ステートメントを簡単に組み立てることができます。

次の複数の SQL ステートメントを使用すると、条件の組み合わせ

$map1 = [
        ['name', 'like', 'thinkphp%'],
        ['title', 'like', '%thinkphp'],
    ];
    
$map2 = [
        ['name', 'like', 'kancloud%'],
        ['title', 'like', '%kancloud'],
    ];    
    
Db::table('think_user')
    ->whereOr([ $map1, $map2 ])
    ->select();

によって生成される SQL ステートメントは次のとおりです。

SELECT * FROM `think_user` WHERE ( `name` LIKE 'thinkphp%' AND `title` LIKE '%thinkphp' ) OR ( `name` LIKE 'kancloud%' AND `title` LIKE '%kancloud' )

Closure query

$name = 'thinkphp';
$id = 10;
Db::table('think_user')->where(function ($query) use($name, $id) {
    $query->where('name', $name)
        ->whereOr('id', '>', $id);
})->select();

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

です。
SELECT * FROM `think_user` WHERE ( `name` = 'thinkphp' OR `id` > 10 )

各閉包条件の両側に括弧が自動的に追加されることがわかります。

混合クエリ

上記のすべてのメソッドを組み合わせて、たとえば次のような混合クエリを実行できます。

Db::table('think_user')
    ->where('name', ['like', 'thinkphp%'], ['like', '%thinkphp'])
    ->where(function ($query) {
        $query->where('id', ['<', 10], ['>', 100], 'or');
    })
    ->select();

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

SELECT * FROM `think_user` WHERE ( `name` LIKE 'thinkphp%' AND `name` LIKE '%thinkphp' ) AND ( `id` < 10 or `id` > 100 )

文字列条件クエリ

非常に複雑なクエリの場合は、ネイティブ SQL ステートメントを直接使用してクエリすることもできます。例:

Db::table('think_user')
    ->where('id > 0 AND name LIKE "thinkphp%"')
    ->select();

安全上の理由から、文字列クエリ条件にパラメータ バインディングを使用できます。例:

Db::table('think_user')
    ->where('id > :id AND name LIKE :name ', ['id' => 0, 'name' => 'thinkphp%'])
    ->select();

whereRaw メソッドを使用することをお勧めします。

Db::table('think_user')
    ->whereRaw('id > :id AND name LIKE :name ', ['id' => 0, 'name' => 'thinkphp%'])
    ->select();

クエリの使用

where メソッドを 1 回呼び出して Query オブジェクトを渡すことでクエリを実行できます。

$query = new \think\db\Query;
$query->where('id','>',0)
	->where('name','like','%thinkphp');

Db::table('think_user')
    ->where($query)
    ->select();

Query オブジェクトの where メソッドは一度だけ呼び出すことができ、where メソッド内でのみ呼び出すことができます。クエリ以外の条件チェーン メソッドがクエリ オブジェクトで使用されている場合、現在のクエリは実行されません。渡される。

$query = new \think\db\Query;
$query->where('id','>',0)
	->where('name','like','%thinkphp')
    ->order('id','desc') // 不会传入后面的查询
    ->field('name,id'); // 不会传入后面的查询

Db::table('think_user')
    ->where($query)
    ->where('title','like','thinkphp%') // 有效
    ->select();

ショートカット メソッド

システムは、クエリを簡素化するために、次のような一連のショートカット メソッドをカプセル化します。

#メソッド関数##場所またはwhereXorwhereNullwhereNotNullwhereInwhereNotIn##whereBetween#Field NOT BETWEEN クエリwhereLikeField LIKE クエリ whereNotLike #フィールドが一致しないクエリEXISTS 条件クエリ
Db::table('think_user')
    ->whereColumn('update_time','>','create_time')
    ->select();
生成される SQL ステートメントは次のとおりです:
SELECT * FROM `think_user` WHERE ( `update_time` > `create_time` )
フィールド OR クエリ
フィールド XOR クエリ
フィールドが Null かどうかのクエリ
フィールドが Null かどうかのクエリ
フィールド IN クエリ
フィールドが IN ではありませんクエリ
#フィールド BETWEEN クエリ##whereNotBetween
whereExists
whereNotExistsNOT EXISTS 条件クエリ
whereExp式クエリ
whereColumn2 つのフィールドを比較
次は、次の 2 つのフィールドの例です。クエリ条件の whereColumn メソッドの使用。 update_time が create_time より大きいユーザー データをクエリします
名前とニックネームが同じユーザー データをクエリします

Db::table('think_user')
    ->whereColumn('name','=','nickname')
    ->select();

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

SELECT * FROM `think_user` WHERE ( `name` = `nickname` )

同じフィールド条件を次のように単純化することもできます

Db::table('think_user')
    ->whereColumn('name','nickname')
    ->select();

複数フィールドの配列比較をサポートします

Db::name('user')->whereColumn([
	['title', '=', 'name'],
    ['update_time', '>=', 'create_time'],
])->select();

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

SELECT * FROM `think_user` WHERE ( `name` = `nickname` AND `update_time` > `create_time` )

動的クエリ

クエリ コンストラクターは、次のようなクエリ条件を簡略化するための動的クエリ メカニズムも提供します。

##動的クエリ

説明

whereFieldNameクエリ a特定のフィールド ValuewhereOrFieldName#getByFieldName ##getFieldByFieldNameFieldName は、データ テーブルの実際のフィールド名のキャメル ケース表現を表します。データ テーブル ユーザーに email フィールドと nick_name フィールドがあると仮定すると、次のようにクエリできます。 #
// 根据邮箱(email)查询用户信息
$user = Db::table('user')
	->whereEmail('thinkphp@qq.com')
    ->find();

// 根据昵称(nick_name)查询用户
$email = Db::table('user')
    ->whereNickName('like', '%流年%')
    ->select();
    
// 根据邮箱查询用户信息
$user = Db::table('user')
    ->getByEmail('thinkphp@qq.com');
    
// 根据昵称(nick_name)查询用户信息
$user = Db::table('user')
    ->field('id,name,nick_name,email')
    ->getByNickName('流年');
    
// 根据邮箱查询用户的昵称
$nickname = Db::table('user')
    ->getFieldByEmail('thinkphp@qq.com', 'nick_name');
    
// 根据昵称(nick_name)查询用户邮箱
$email = Db::table('user')
    ->getFieldByNickName('流年', 'email');
getBy メソッドと getFieldBy メソッドは 1 つのレコードのみをクエリし、他のチェーン メソッドと組み合わせて使用​​できますクエリ ビルダーは、
Db::name('user')->when($condition, function ($query) {
    // 满足条件后执行
    $query->where('score', '>', 80)->limit(10);
})->select();
特定のフィールドの値をクエリ
特定のフィールドに基づくクエリ
特定のフィールドに基づいて値を取得する
条件付きクエリ
などの条件付きクエリをサポートし、条件

Db::name('user')->when($condition, function ($query) {
    // 满足条件后执行
    $query->where('score', '>', 80)->limit(10);
}, function ($query) {
    // 不满足条件执行
    $query->where('score', '>', 60);
});

を満たさない分岐クエリをサポートします。