>PHP 프레임워크 >ThinkPHP >ThinkPHP 데이터베이스 쿼리 모델에 대한 심층 분석

ThinkPHP 데이터베이스 쿼리 모델에 대한 심층 분석

咔咔
咔咔원래의
2021-01-08 10:41:212026검색
"

위에서 ThinkPHP데이터베이스 쿼리 Db 메소드에 대해 이야기했습니다. 오늘은 Model 클래스 구현에 대해 간략하게 이야기하겠습니다.

"

머리말

모델 이것이 프레임워크에서 언급된 모델 개념이며, 이 사용법이 프레임워크 사용법의 대부분을 차지합니다.

다음으로 카카는 위의 내용을 바탕으로 모델에 대한 심층 분석을 계속 진행할 예정이니 이제 벤치를 준비하고 멜론 씨앗을 먹어 이 글을 읽어보세요!

위에서 제공하는 Db 클래스의 실행 흐름도도 공개되어 있으니 숙지하실 수 있습니다.

ThinkPHP 데이터베이스 쿼리 모델에 대한 심층 분석
Db 클래스 실행 과정

1. 모델의 일부 사용 파일을 간략히 살펴봅니다

모델 디렉터리는 모듈 디렉터리에 있어야 합니다

ThinkPHP 데이터베이스 쿼리 모델에 대한 심층 분석
모델 디렉터리

그런 다음 프레임워크의 맨 아래 레이어로 이동하면 모델 클래스에 대한 파일을 볼 수 있습니다. 이 수업에서는 이전에 배운 두 가지 지식 포인트가 사용됩니다.

첫 번째는 ArrayAccess가 배열에 액세스하는 것처럼 객체의 속성에 액세스한다는 것입니다.

두 번째 기능은 슈퍼 클래스(특성)로 실제로 다중 상속과 유사한 기능을 구현하지만 PHP에는 다중 상속이 없으므로 두 개념을 혼동할 수 없다는 점을 기억하세요.

ThinkPHP 데이터베이스 쿼리 모델에 대한 심층 분석
모델 클래스 프레임워크의 하단 레이어

그리고 프레임워크 하단에도 Db 클래스와 동일한 기능을 사용하는 모델 폴더가 있습니다.

예를 들어 커넥터, 쿼리, 생성기

ThinkPHP 데이터베이스 쿼리 모델에 대한 심층 분석
모델 클래스의 기본 파일

간단한 이해 후, 하나의 사례 구현을 위해 모델 내 사례를 분석해야 합니다!

2. 모델 시나리오 분석 중 신규 로직 소스코드 분석

본 사례는 모델에 새로 추가된 사항을 사례분석으로 활용하고, 소스코드에 대한 심층분석을 진행합니다.

먼저 모델 파일을 생성해야 합니다. 카카는 파일을 생성하기 위해 항상 명령줄을 사용합니다.

ThinkPHP 데이터베이스 쿼리 모델에 대한 심층 분석
모델 파일 만들기

그런 다음 첫 번째 기능을 구현하고 모델을 사용하여 추가하면 됩니다. 이 작업은 몇 단계만 거치면 완료될 수 있습니다. Kaka 주요 업무는 모든 사람을 위한 구현 프로세스를 분석하는 것입니다.

여기서 카카를 쓰는 방식에 주의하세요.

ThinkPHP 데이터베이스 쿼리 모델에 대한 심층 분석
컨트롤러에 케이스 구현

카카가 왜 이런 식으로 작성하는지, 이렇게 작성하면 어떤 이점이 있는지 간략하게 말씀드리겠습니다.

우선 모델 클래스 소개가 필수입니다.

그런 다음 변수를 선언합니다

마지막 단계는 컨트롤러가 초기화될 때 선언된 변수에 모델 클래스를 할당하는 것입니다.

그럼 사용시 선언된 변수만 사용하면 나중에 모델명이 충돌할 때 수정되는 코드의 양을 줄일 수 있다는 장점이 있습니다.

모델명을 미리 정의하고 나중에 모델명을 변경하고 싶은 경우를 생각해 볼 수 있습니다. 이때 Kaka의 작성 방법을 따르면 컨트롤러 초기화에 있는 내용만 필요합니다. , 한 줄의 코드로 완료할 수 있습니다.

그렇지 않으면 전체 코드를 수정해야 하기 때문에 Kaka가 이렇게 작성합니다.

먼저 실행해서 실행 결과를 살펴보겠습니다.

ThinkPHP 데이터베이스 쿼리 모델에 대한 심층 분석
실행 결과

위 그림의 결과에 따르면 코드 로직에는 문제가 없음을 알 수 있습니다. 다음으로 저장 방법에 대한 심층 분석을 수행하여 차이점을 살펴보겠습니다. 모델과 Db 클래스의 실행 방법.

저장 방법 심층 분석

우선 이 코드가 어떤 파일에서 실행될지 이해해야 합니다.

ThinkPHP 데이터베이스 쿼리 모델에 대한 심층 분석
이 코드 줄을 구문 분석하면 해당 파일이 실행됩니다.

$this->userModel가 모델의 클래스 개체라는 것을 모두 알고 있으므로 모델 파일로 직접 이동하여 살펴보세요.

사실 이 파일을 읽든 안 읽든 상관없습니다. 우리의 맞춤형 모델 파일은 카카가 이 글 초반에 보여드린 파일인 모델 파일을 상속받아야 합니다.

ThinkPHP 데이터베이스 쿼리 모델에 대한 심층 분석
모델 간의 기본 관계

그런 다음 프레임워크 하단의 모델 클래스로 이동합니다thinkphp/library/think/Model.php. thinkphp/library/think/Model.php

看到这个方法是不是应该明白一点点东西,就是不去看文档也应该一下明白,当save方法只有一个参数的时候就是新增,当存在第二个参数时就是更新。

ThinkPHP 데이터베이스 쿼리 모델에 대한 심층 분석
ThinkPHP 데이터베이스 쿼리 모델에 대한 심층 분석

由于咔咔的案例中给的参数就是一个数组,所以第一个判断就不会执行。

接下来将对这个save方法中的ThinkPHP 데이터베이스 쿼리 모델에 대한 심층 분석进行深度解析。

接下来看一下这个方法都进行了什么操作。

ThinkPHP 데이터베이스 쿼리 모델에 대한 심층 분석
ThinkPHP 데이터베이스 쿼리 모델에 대한 심층 분석

根据上图可以得知传递过来的参数就是数组,也就是我们需要新增的数据。

在上图中最重要的一个步骤就是这行代码$this->setAttr($key, $value, $data);

이 메서드를 보고 조금 이해해야 합니다. 문서를 읽지 않더라도 save 메서드에 매개 변수가 하나만 있으면 추가되고 두 ​​번째 매개 변수가 있으면 한 번에 이해해야 합니다. , 업데이트되었습니다.

현재 데이터 객체 저장🎜현재 데이터 객체를 저장합니다🎜🎜🎜Kaka의 경우 주어진 매개변수가 배열이므로 첫 번째 판단은 실행되지 않습니다. 🎜🎜 다음으로 이 저장 방법에 쓰기 심층적인 분석을 위해 이전의 데이터를 확인하세요. 🎜🎜이 방법이 무엇인지 살펴보겠습니다. 🎜🎜쓰기 전에 데이터 확인🎜작성하기 전에 데이터를 확인하세요🎜🎜🎜위 그림에 따르면 전달된 매개 변수가 추가해야 할 데이터인 배열임을 알 수 있습니다. 🎜🎜위 그림에서 가장 중요한 단계는 이 코드 줄입니다$this->setAttr($key, $value, $data);🎜🎜 프롬프트에 따라 이 방법으로 왔습니다. 세 매개 변수의 값도 인쇄되었습니다. 따라서 실행은 데이터 개체 속성을 설정하는 마지막 단계만 수행됩니다. 🎜
修改器 设置数据对象值
수정자는 데이터 개체 값을 설정합니다

위 그림에 따르면 최종 반환 결과는 $this->checkBeforeSave($data, $where)는 아래 그림입니다. $this->checkBeforeSave($data, $where),也就是下图。

ThinkPHP 데이터베이스 쿼리 모델에 대한 심층 분석
ThinkPHP 데이터베이스 쿼리 모델에 대한 심층 분석

接下来关于$result = $this->exists ? $this->updateData($where) : $this->insertData($sequence);这行代码就需要该好好理解一下了。

首先可以看到第一个属性那就是$this->exists,这个值熟悉不,没错,就是在ThinkPHP 데이터베이스 쿼리 모델에 대한 심층 분석时如果存在where条件则会设置为true,请看下图

ThinkPHP 데이터베이스 쿼리 모델에 대한 심층 분석
ThinkPHP 데이터베이스 쿼리 모델에 대한 심층 분석

所以说代码会执行$this->insertData($sequence)

쓰기 전에 데이터 확인

쓰기 전에 데이터를 확인하세요

🎜🎜다음에 대해$result = $this->exists ? $this->updateData($where) : $this->insertData($sequence);이 줄 코드를 주의 깊게 이해해야 합니다. 🎜🎜먼저 첫 번째 속성인 $ ->exists, 이 값 익숙하시죠? 네, 작성 전 데이터 확인 시 where 조건이 존재하면 true로 설정됩니다🎜🎜쓰기 전에 데이터 확인🎜쓰기 전에 데이터를 확인하세요🎜🎜🎜그래서 코드가 실행됩니다$this->insertData($sequence)이 방법에서는 아무것도 신경 쓰지 않고 데이터를 추가하는 방법에 중점을 둡니다. 🎜🎜카카가 동그라미 친 부분만 주목해주세요. 🎜
ThinkPHP 데이터베이스 쿼리 모델에 대한 심층 분석
새로 작성된 데이터를 추가하세요

그러면 삽입 메소드에 코드가 추가됩니다. 이 메소드에서는$this->parseOptions();이전에 분석한 분석 표현식(쿼리 또는 쓰기 작업에 사용할 수 있음) 콘텐츠. $this->parseOptions();这里就是之前分析的分析表达式(可用于查询或者写入操作)这块内容。

在这里就使用了连接器,这个连接器就是在本类的构造函数通过依赖注入的方式注入进来的对象。

ThinkPHP 데이터베이스 쿼리 모델에 대한 심층 분석
ThinkPHP 데이터베이스 쿼리 모델에 대한 심층 분석

然后就会来到thinkphp/library/think/db/Connection.php这个文件的insert方法。

接着会调用execute方法进行执行SQL语句,因为在这之前已经将sql语句生成好了,在下文将重新起一个小节深度解析这个方法。

通过builder

여기서 커넥터가 사용됩니다. 이 커넥터는 이 클래스의 생성자에서 종속성 주입을 통해 주입된 개체입니다. 🎜🎜기록 삽입🎜레코드를 삽입하면🎜🎜🎜 그러면 thinkphp/library/think/db/Connection.php삽입 방법. 🎜🎜그런 다음 실행 방법 SQL 문을 실행합니다. SQL 문은 이전에 생성되었기 때문에 이 방법을 심층적으로 분석하기 위해 아래에서 새로운 섹션을 시작하겠습니다. 🎜🎜Bybuilder 클래스는 SQL 문을 생성하고 그런 다음 바인딩된 매개변수를 가져오고 이를 지웁니다. 마지막으로 실행 작업을 사용하여 SQL 문을 실행합니다🎜
ThinkPHP 데이터베이스 쿼리 모델에 대한 심층 분석
기록 삽입

3. 실행 실행에 대한 심층 분석

케이스는 여전히 이전 섹션에서 사용된 것입니다

ThinkPHP 데이터베이스 쿼리 모델에 대한 심층 분석
케이스 시연

우선 , 이를 명확하게 해야 합니다실행 이 방법에는 세 가지 매개변수가 있습니다. 주로 첫 번째 매개변수와 두 번째 매개변수를 설명합니다. execute这个方法的参数,在这个方法存在三个参数,主要说明第一和第二个参数。

参数的值咔咔已经放到了代码注释中。

ThinkPHP 데이터베이스 쿼리 모델에 대한 심층 분석
ThinkPHP 데이터베이스 쿼리 모델에 대한 심층 분석

然后一步一步的分析,首先执行的是$this->initConnect(true);ThinkPHP 데이터베이스 쿼리 모델에 대한 심층 분석。

在这个方法中需要知道的是,这里到底判断的是什么,其实也就是deploy

매개변수 값은 코드 주석에 넣었습니다.
ThinkPHP 데이터베이스 쿼리 모델에 대한 심층 분석명시적 매개변수
매개변수 지우기

그런 다음 단계별로 분석합니다. 가장 먼저 해야 할 일은 $this->initConnect(true);데이터베이스 연결을 초기화합니다.

🎜이 방법에서 알아야 할 것은 여기서 판단되는 내용이 실제로는 배포이 매개변수는 무엇인가요? 🎜🎜🎜🎜데이터베이스 연결 초기화🎜🎜🎜먼저 이 매개변수는 구성 파일에서 얻어야 한다는 점을 분명히 해야 합니다. 그런 다음 지금 구문 분석하는 것은 데이터베이스이므로 이 매개변수는 다음과 같을 가능성이 매우 높습니다. 데이터베이스 구성 파일에서 . 🎜

코드를 분석한 결과 데이터베이스 구성 파일에서 이 구성 항목을 발견했습니다. 이 구성 항목은 데이터베이스의 배포 방법입니다.

0 중앙화(단일 서버), 1 분산(마스터-슬레이브 서버). 이 경우 또는 실제 프로젝트 운영에서는 분산 데이터베이스가 프레임워크에서 사용되지 않으므로 이해할 필요가 없습니다.

ThinkPHP 데이터베이스 쿼리 모델에 대한 심층 분석
데이터베이스 구성 파일

그런 다음 코드는 계속 실행됩니다$this->linkID = $this->connect();, 즉, 주석은 기본 단일 데이터베이스에 대한 힌트를 제공합니다. $this->linkID = $this->connect();,也就是注释给的提示为默认单数据库。

来到这个方法中,咔咔截图截到的地方会进行数据库连接ID 支持多个连接的判断。

然后第二个判断会直接获取参数配置信息和本类的构造函数中提前获取的到的ThinkPHP 데이터베이스 쿼리 모델에 대한 심층 분석,并且最后返回给config属性。

ThinkPHP 데이터베이스 쿼리 모델에 대한 심층 분석
ThinkPHP 데이터베이스 쿼리 모델에 대한 심층 분석

接下来解析ThinkPHP 데이터베이스 쿼리 모델에 대한 심층 분석这块的内容,这块的内容,判断配置信息中的params索引值,这个值在配置文件是一个空数组,所以是返回true的。

第二个判断是否为数组同样也会返回true。

所以说这个判断条件成立,会执行if的判断语句。

在这里说一个小的知识点就是关于运算符与或非

이 방법을 사용하면 카카 스크린샷을 촬영한 위치는 데이터베이스 연결 ID를 기준으로 다중 연결을 지원하는 것으로 판단됩니다.

그런 다음 두 번째 판단에서는 이 클래스의 생성자에서 미리 얻은 매개변수 구성 정보와 데이터베이스 구성 파일을 직접 가져와서 최종적으로 config 속성에 반환합니다.

데이터베이스 연결 방법🎜Connect to Database method🎜🎜🎜다음으로 연결 매개변수 블록의 내용을 구문 분석합니다. 이 블록의 내용은 구성 정보의 params 인덱스 값을 결정합니다. 값은 구성 파일에 있으므로 빈 배열이므로 true를 반환합니다. 🎜🎜배열인지 여부에 대한 두 번째 판단도 true를 반환합니다. 🎜🎜그래서 이 판단 조건이 성립되면 if 판단문이 실행됩니다. 🎜🎜여기서 약간의 지식 포인트는 연산자 AND 또는 NOT. 🎜🎜And: 모든 조건이 true이면 true를 반환🎜🎜 또는: 하나의 조건이 true이면 true를 반환🎜
ThinkPHP 데이터베이스 쿼리 모델에 대한 심층 분석
연결 매개변수

위 그림의 속성 유형params는 미리 선언되어 있습니다. 여기서는 pdo가 mysql에 연결할 때 필요한 매개변수만 필요합니다. params已经提前声明好了,这里只需要这是pdo连接mysql时需要的参数即可。

PDOThinkPHP 데이터베이스 쿼리 모델에 대한 심층 분석
PDOThinkPHP 데이터베이스 쿼리 모델에 대한 심층 분석

为了方便大家理解咔咔将这个参数给大家打印了出来,请看下图。

PDOThinkPHP 데이터베이스 쿼리 모델에 대한 심층 분석
PDOThinkPHP 데이터베이스 쿼리 모델에 대한 심층 분석

也就说关于pdo参数其实就是声明的一系列常量而已。

接下来就是重中之重了,也就是使用pdo的方式进行连接数据库,并且将连接信息返回回去,也就是返回给$this->linkID,直到这里ThinkPHP 데이터베이스 쿼리 모델에 대한 심층 분석就结束了。

ThinkPHP 데이터베이스 쿼리 모델에 대한 심층 분석
ThinkPHP 데이터베이스 쿼리 모델에 대한 심층 분석

然后就会使用PDo的操作实例执行execute

PDO 연결 매개변수

PDO 연결 매개변수Kaka는 이해를 돕기 위해 이 매개변수를 인쇄했습니다. 아래 그림을 참조하세요. PDO 연결 매개변수PDO 연결 매개변수

즉, pdo 매개변수는 실제로 일련의 선언된 상수입니다. 🎜🎜다음 단계는 pdo를 사용하여 데이터베이스에 연결하고 연결 정보, 즉 $this->linkID, 여기에서 데이터베이스 연결이 초기화되기 전까지는 종료됩니다. 🎜🎜pdo를 사용하여 데이터베이스에 연결🎜pdo를 사용하여 데이터베이스에 연결🎜🎜🎜그런 다음 PDo 작업 인스턴스를 사용하여 실행됩니다execute 이 메소드는 궁극적으로 레코드 수를 반환하거나 영향을 주는 내장 메소드입니다. 🎜🎜🎜🎜🎜 4. 요약 🎜🎜🎜🎜🎜이 섹션에서는 모델에 필요한 파일을 이해하는 것부터 시작하여 모델 추가에 대한 심층적인 소스 코드 분석을 수행합니다. 🎜

소스 코드를 파싱하는 과정에서 일부 부분이 완전히 설명되지 않았지만 핵심 부분은 다루었습니다.

마지막으로 execute 이 메서드를 심층적으로 분석했습니다. 왜 이 메서드를 분석해야 할까요? 왜냐하면 이 메서드는 모든 작업 실행의 마지막 단계이기 때문입니다.

배움에 대한 끈기, 블로깅에 대한 끈기, 공유에 대한 끈기는 카카가 경력 이후부터 지켜온 신념입니다. 거대한 인터넷에 올라온 카카의 글이 여러분에게 조금이나마 도움이 되기를 바랍니다. 카카 다음호에서 만나요

위 내용은 ThinkPHP 데이터베이스 쿼리 모델에 대한 심층 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.