고급 쿼리(쿼리 빌더 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 쿼리를 사용하는 경우 원시 메서드를 사용해야 합니다. .

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 문을 쉽게 조합할 수 있습니다.

다음과 같은 여러 조건의 조합을 사용하는 경우

$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 메소드를 한 번 호출하고 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();

바로가기 방법

시스템은 쿼리를 단순화하기 위해 다음을 포함한 일련의 바로가기 방법을 캡슐화합니다.

MethodFunction
whereOrwhereOr字段OR查询
whereXor字段XOR查询
whereNull查询字段是否为Null
whereNotNull查询字段是否不为Null
whereIn字段IN查询
whereNotIn字段NOT IN查询
whereBetween字段BETWEEN查询
whereNotBetween字段NOT BETWEEN查询
whereLike字段LIKE查询
whereNotLike字段NOT LIKE查询
whereExistsEXISTS条件查询
whereNotExistsNOT EXISTS条件查询
whereExp表达式查询
whereColumn比较两个字段

下面举例说明下两个字段比较的查询条件whereColumn方法的用法。

查询update_time大于create_time的用户数据

Db::table('think_user')
    ->whereColumn('update_time','>','create_time')
    ->select();

生成的SQL语句是:

SELECT * FROM `think_user` WHERE ( `update_time` > `create_time` )

查询name和nickname相同的用户数据

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` )

动态查询

查询构造器还提供了动态查询机制,用于简化查询条件,包括:

field OR querywhereXor
动态查询描述
whereFieldName查询某个字段的值
whereOrFieldName查询某个字段的值
getByFieldName根据某个字段查询
getFieldByFieldName

field XOR query

<코드 >whereNull

필드가 Null인지 쿼리

whereNotNull

필드가 Null이 아닌지 쿼리

🎜whereIn🎜🎜Field IN 쿼리 🎜🎜🎜🎜whereNotIn🎜🎜field NOT IN 쿼리🎜🎜🎜🎜whereBetween🎜🎜field BETWEEN 쿼리🎜🎜🎜🎜whereNotBetween🎜 🎜field NOT BETWEEN query🎜🎜🎜🎜whereLike🎜🎜field LIKE query🎜🎜🎜🎜whereNotLike🎜🎜field NOT LIKE query🎜🎜🎜🎜whereExists 🎜🎜EXISTS 조건 쿼리🎜🎜🎜🎜whereNotExists🎜🎜NOT EXISTS 조건 쿼리🎜🎜🎜🎜whereExp🎜🎜표현식 쿼리🎜🎜🎜🎜whereColumn< / code>🎜🎜두 필드 비교🎜🎜🎜🎜🎜다음은 whereColumn 메소드를 사용하여 두 필드 간의 쿼리 조건을 비교하는 방법에 대한 예제입니다. 🎜🎜🎜update_time이 create_time보다 큰 사용자 데이터 쿼리🎜
// 根据邮箱(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');
🎜생성된 SQL 문은 다음과 같습니다.🎜
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);
});
🎜생성된 SQL 문은 다음과 같습니다.🎜rrreee🎜동일한 필드 조건은 다음과 같습니다. 또한 단순화됩니다🎜 rrreee🎜는 여러 필드의 배열 비교를 지원합니다🎜rrreee🎜생성된 SQL 문은 다음과 같습니다.🎜rrreee🎜🎜동적 쿼리🎜🎜🎜🎜쿼리 생성자는 쿼리 조건을 단순화하는 동적 쿼리 메커니즘도 제공합니다.🎜🎜 🎜🎜 🎜동적 쿼리🎜🎜Description🎜🎜🎜🎜🎜🎜whereFieldName🎜🎜특정 필드의 값 쿼리🎜🎜🎜🎜whereOrFieldName🎜🎜의 값 쿼리 특정 필드🎜🎜 🎜🎜getByFieldName🎜🎜특정 필드를 기반으로 쿼리🎜🎜🎜🎜getFieldByFieldName🎜🎜특정 필드를 기반으로 특정 값 가져오기🎜🎜🎜🎜🎜 여기서 FieldName은 데이터 테이블을 나타냅니다. 실제 필드 이름의 카멜 케이스 표현입니다. 데이터 테이블 user에 email 및 nick_name 필드가 있다고 가정하면 다음과 같이 쿼리할 수 있습니다. 🎜🎜rrreee🎜getBy 및 getFieldBy 메소드는 하나의 레코드만 쿼리하며 다른 체인 메소드와 함께 사용할 수 있습니다. 🎜🎜🎜조건부 쿼리🎜🎜🎜🎜쿼리 생성자는 다음과 같은 조건부 쿼리를 지원합니다. 🎜rrreee🎜 및 다음과 같은 조건을 지원합니다. 조건을 충족하지 않음 분기 쿼리🎜rrreee🎜 🎜