이전 기사에서는 기본 데이터 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 유형입니다. = 1 AND status=1
문자열 쿼리를 사용할 때 새 버전에서 제공하는 문자열 조건의 보안 전처리 메커니즘을 사용할 수 있는데 이에 대해서는 당분간 자세히 설명하지 않겠습니다. 2. 배열을 쿼리 조건으로 사용하는 것이 가장 일반적으로 사용되는 쿼리 방법입니다. 예:
$User = M("User") // 사용자 개체 인스턴스화
$condition[ ' name'] = 'thinkphp';
$condition['status'] = 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") // User 객체 인스턴스화 // 쿼리 조건 정의 $condition = new stdClass() $condition->name = 'thinkphp'; $condition->status= 1; $User->where($condition)->select() 최종 생성된 SQL 문은 위와 같습니다SELECT * FROM think_user WHERE `name`='thinkphp' AND status=1객체 모드 쿼리 사용과 배열 쿼리 사용의 효과는 동일하며 상호 교환이 가능합니다. 대부분의 경우 더 효율적으로 배열 모드를 사용하는 것이 좋습니다. . 표현식 쿼리위 쿼리 조건은 단순한 동등 판단에 불과하며, 더 많은 SQL 쿼리 구문을 지원하기 위해 쿼리 표현식을 사용할 수도 있습니다. 이는 ThinkPHP 쿼리 언어이기도 합니다. 쿼리 표현식의 핵심은 사용 형식입니다: $map['field name'] = array('expression','query Condition'); 지원되는 쿼리 표현식은 각각 다음과 같습니다. 의미는 다음과 같습니다. 표현의미 EQ 같음(=) NEQ 아님 같음(<>) GT 초과(>) EGT 초과(>=) LT 미만(< )ELT 작거나 같음(
LIKE 퍼지 쿼리
[NOT] BETWEEN(아님) 간격 쿼리
[NOT] IN(아님 ) IN 쿼리
EXP 표현식 쿼리, SQL 구문 지원
예는 다음과 같습니다. EQ: 같음 (=)
예:
$map[' id'] = array( 'eq',100);
은 다음 쿼리와 동일합니다.
$map['id'] = 100;
is id = 100NEQ: 같지 않음 (<>)예:
쿼리
으로 표시되는 조건은 id < 100GT: 보다 큼(>) 예:
예:
예:
예:
와 동일합니다. 예:
DB_LIKE_FIELDS 매개변수가 구성되면 일부 필드는 자동으로 퍼지 쿼리를 수행합니다. 예를 들어
예를 들어 배열 모드를 지원합니다.
$map['id'] = array('not in','1,5,8');은 다음과 동일합니다: $map['id '] =array('not in',array('1','5','8'));쿼리 조건은 id NOT IN (1,5, 8)EXP: 표현식이 됩니다. 더 복잡한 쿼리 상황 지원
예:
'_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'가 됩니다. 참고: 바로가기 쿼리에서 "|"와 "&"는 동시에 사용할 수 없습니다. 간격 쿼리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 등의 표현식을 지원한다는 의미입니다. 또한 간격 쿼리는 한 필드에 대한 조건을 함께 작성할 수 있는 한 더 많은 조건을 지원할 수도 있습니다. 예:
배열 조건은 문자열 조건과 혼합될 수도 있습니다. 예:
예:
여러 쿼리 메서드를 서로 변환할 수 있습니다. 예를 들어 위 쿼리 조건은 다음과 같이 변경할 수 있습니다.
애플리케이션에서는 현재 사용자 수(또는 특정 조건을 충족하는 사용자), 전체 사용자의 최대 포인트, 사용자의 평균 점수 등과 같은 일부 통계 데이터를 사용하는 경우가 많습니다. 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(' 점수');
그리고 모든 통계 쿼리는 일관된 작업 사용을 지원합니다.
SQL 쿼리
ThinkPHP에 내장된 ORM 및 ActiveRecord 모드는 편리한 데이터 액세스 작업을 구현하며, 새 버전에 추가된 일관성 있는 작업 기능으로 이러한 데이터 작업이 더욱 편리해졌습니다. 명확하지만 ThinkPHP는 여전히 기본 SQL 쿼리 및 실행 작업 지원을 유지합니다. 복잡한 쿼리 및 일부 특수 데이터 작업의 요구 사항을 충족하기 위해 SQL 쿼리의 반환 값은 아무런 처리 없이 직접 반환된 Db 클래스의 쿼리 결과입니다. . 주로 다음 두 가지 방법이 있습니다.
1. 쿼리 방법
query는 SQL 쿼리 작업을 수행합니다.
사용법 쿼리( $ sql,$parse=false)
매개변수 sql(필수): 쿼리할 SQL 문
parse(선택): SQL을 파싱해야 하는지 여부 반환값
데이터가 불법이거나 쿼리가 잘못된 경우 false를 반환
그렇지 않으면 쿼리 결과 데이터셋을 반환(select 방식과 동일)
사용 예:
$Model = new Model() // 어떤 데이터 테이블에도 해당하지 않는 모델 객체 인스턴스화
$Model->query( "select * from think_user where status=1");
현재 분산 데이터베이스를 사용하고 읽기-쓰기 분리를 설정한 경우 쿼리 메서드는 항상 읽기 서버에서 실행되므로 쿼리 메서드는 SQL 문이 무엇인지에 관계없이 읽기 작업. 2. 실행 메소드
execute는 데이터의 sql 작업을 업데이트하고 작성하는 데 사용됩니다.
execute($sql,$parse=false)
매개변수 sql(필수): 실행할 SQL문
parse(선택): SQL을 파싱해야 하는지 여부 반환값 데이터가 불법이거나 쿼리가 잘못된 경우 false를 반환합니다. 틀림 그렇지 않으면 영향을 받은 레코드 수를 반환
$Model = new Model() // 어떤 데이터 테이블에도 해당하지 않는 모델 객체 인스턴스화
$Model-> ;execute("update think_user set name='thinkPHP' where status=1");
현재 분산 데이터베이스를 사용하고 읽기-쓰기 분리를 설정한 경우 실행 메소드는 항상 쓰기 서버에서 실행되므로 실행 메소드는 SQL 문이 무엇인지에 관계없이 쓰기 작업에 해당합니다.
동적 쿼리
ThinkPHP는 PHP5 언어 기능을 사용하여 동적 쿼리를 구현합니다. 핵심 모델의 동적 쿼리 메서드는 다음과 같습니다.
메소드 이름
설명
예
getBy 필드 값을 기준으로 데이터 쿼리 예: getByName, getByEmail
getFieldBy 필드 기반 쿼리 및 쿼리 특정 필드의 값을 반환합니다. 예: getFieldByName
1. getBy 동적 쿼리 이 쿼리 메서드는 데이터 테이블의 필드를 쿼리합니다. 예를 들어 User 객체에는 id, name, email, address 등과 같은 속성이 있습니다. 그러면 다음 쿼리 방법을 사용하여 특정 속성을 기반으로 조건을 충족하는 레코드를 직접 쿼리할 수 있습니다.
$user = $User->getByName('liu21st');
$user = $User->getByEmail('liu21st@gmail.com');
$user = $User->getByAddress('Shenzhen, China');
현재 다중 데이터 필드의 동적 쿼리 방법은 지원되지 않습니다. 찾기 방법과 선택 방법을 사용하십시오. 질문. 2. getFieldBy 동적 쿼리는 특정 필드를 쿼리하고
과 같은 특정 필드의 값을 반환합니다.$userId = $User->getFieldByName('liu21st','id');
는 사용자 이름을 기준으로 사용자 ID 값을 가져오는 것을 의미합니다.
Subquery
버전 3.0부터 Subquery 지원이 추가되었습니다. 1. Select의 매개변수일 때 Select 메소드를 사용합니다. method가 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은 Table where 등 ThinkPHP의 일관된 연산 방식에 사용될 수 있습니다.
요약
이 글은 주로 단순 쿼리, 표현식 쿼리, 퀵 쿼리, 간격 쿼리, 통계 쿼리 등 데이터 쿼리 방법과 수행 방법을 이해하는 데 도움이 됩니다. 하위 쿼리 작업. 나중에 우리는 일관성 있는 작업을 사용하여 보다 복잡한 CURD 작업을 수행하는 방법에 대해 자세히 알아볼 것입니다.
위는 ThinkPHP3.1 Quick Start (3) Query Language의 내용입니다. 더 많은 관련 내용은 PHP 중국어 홈페이지(www.php.cn)를 참고해주세요