ホームページ  >  記事  >  PHPフレームワーク  >  ThinkPHP データベース クエリのモデルの詳細な分析

ThinkPHP データベース クエリのモデルの詳細な分析

咔咔
咔咔オリジナル
2021-01-08 10:41:211993ブラウズ

ThinkPHP データベース クエリ Db メソッドについては上で説明しました。今日は、モデルの実装について簡単に説明します。 class.Method.

Preface

Model についても、次のとおりです。フレームワーク モデルの概念では、この使用法がフレームワークの使用量の大部分を占めます。

次に、Kaka は上記に基づいてモデルの詳細な分析を継続します。そのため、ベンチを準備してメロンの種を食べてこの記事を読んでください。

上で提供した Db クラスの実行フローチャートも誰でも公開されているので、よく理解しておくことができます。

ThinkPHP データベース クエリのモデルの詳細な分析
Db クラスの実行プロセス

1. モデルの使用ファイルをいくつか簡単に見てみましょう

モジュール ディレクトリにはモデル ディレクトリが必要です

ThinkPHP データベース クエリのモデルの詳細な分析
モデル ディレクトリ

次に、フレームワークの一番下には、モデル クラスに関するファイルが表示されますが、このクラスでは、これまでに学習した 2 つの知識ポイントが使用されます。

1 つ目は、ArrayAccess が配列のようにオブジェクトのプロパティにアクセスすることです。

2 番目の機能はスーパー クラス (トレイト) で、実際には多重継承に似た関数を実装しますが、PHP には多重継承がないため、2 つの概念を混同できないことに注意してください。

ThinkPHP データベース クエリのモデルの詳細な分析
モデル クラス フレームワークの最下層

フレームワークの最下位にもモデル フォルダーがあり、このフォルダーも同じ機能を使用しますDb クラスとして。

例: コネクタ、クエリ、ジェネレーター

ThinkPHP データベース クエリのモデルの詳細な分析
モデル クラスの基本ファイル

簡単に理解した後、次のことを理解する必要があります。モデル 1 つのケースを実装するために、1 つのケースが分析されました。

#2. モデル シナリオ分析のための新しいロジック ソース コードの分析

このケースでは、モデルのケース分析とソースコードの詳細な分析。

まず、モデル ファイルを作成する必要があります。Kaka は常にコマンド ラインを使用してファイルを作成します。コマンド ラインを使用してファイルを作成する利点は、作成時に名前空間を間違えるのを防ぐことです。ファイル。

ThinkPHP データベース クエリのモデルの詳細な分析
モデル ファイルを作成します

次に、最初の関数を実装し、モデルを使用してそれを追加します。この部分の内容は非常に単純です。数回のクリック このステップはすべて非常に基本的なものですが、Kaka の主な仕事は全員の実装プロセスを分析することです。

コントローラー内のケースは以下の通りですが、ここでのKakaの書き方に注意してください。

ThinkPHP データベース クエリのモデルの詳細な分析
コントローラーでのケース実装

Kaka がなぜこのように書くのか、そしてこの方法で書くことの利点について簡単に説明しましょう。

まず、モデル クラスを導入することが不可欠です。

次に、変数を宣言します。

最後のステップでは、コントローラーの初期化時に、宣言された変数にモデル クラスを割り当てます。

あとは宣言した変数を使用するだけでよいので、後からモデル名が競合した場合にコードの修正量を減らすことができるという利点があります。

モデル名をあらかじめ決めておき、後からモデル名を変更したいというシナリオも考えられますが、このときKakaさんの書き方に従えばコントローラーだけで済みます。初期化は 1 行のコードで実行できます。

それ以外の場合はコード全体を変更する必要があるため、Kaka はこのようにコードを記述しています。

まずは実行して、実行結果を見てみましょう。

ThinkPHP データベース クエリのモデルの詳細な分析
実行結果

上図の結果より、コードロジックに問題がないことが分かります。 saveメソッドを詳しく分析してモデルを見てみる Dbクラスの実行メソッドとの違いは何ですか?

save メソッドの詳細な分析

まず、このコードがどのファイルに実行されるかを理解する必要があります。

ThinkPHP データベース クエリのモデルの詳細な分析
このコード行を解析すると、そのファイルが実行されます

this$this->userModel が次のクラスであることは誰もが知っています。モデル オブジェクトを選択したら、このモデル ファイルに直接アクセスして確認してください。

実際には、このファイルを読むかどうかは関係ありません。カスタマイズされたモデル ファイルは、モデル ファイル (この記事の冒頭で Kaka が示した、モデルで使用されるファイル) を継承する必要があります。 。

ThinkPHP データベース クエリのモデルの詳細な分析
モデル間の基本的な関係

次に、フレームワークの下部にあるモデル クラスに進みます。thinkphp/library/think/Model.php ###。

このメソッドを見れば、少しは理解できるはずです。ドキュメントを読まなくても、すぐに理解できるはずです。save メソッドにパラメータが 1 つしかない場合は、パラメータが追加されます。が 2 番目のパラメータである場合、更新されます。

ThinkPHP データベース クエリのモデルの詳細な分析現在のデータ オブジェクトを保存します。
Kaka の場合に指定されたパラメータは配列であるため、最初の判定は実行されません。

次に、この保存メソッドを書き込む前に、

チェックデータの詳細な分析を実行します。

次に、このメソッドがどのような操作を実行するかを見てみましょう。

ThinkPHP データベース クエリのモデルの詳細な分析書き込み前にデータを確認してください
上の図によると、渡されたパラメータは配列であり、これが必要なデータであることがわかります。追加。

上の図で最も重要なステップは、このコード行です。

$this->setAttr($key, $value, $data);

によるとプロンプト Kaka がこのメソッドに到達すると、3 つのパラメーターの値も出力されているため、判定は実行されず、データ オブジェクトのプロパティを設定する最後のステップのみが実行されます。

修改器 设置数据对象值
Modifier はデータ オブジェクトの値を設定します

上の図によると、最終的な戻り結果は $this->checkBeforeSave($ data, $where) 、それが下の図です。

ThinkPHP データベース クエリのモデルの詳細な分析
書き込み前にデータを確認してください

次について$result = $this->exists ? $this->updateData($ where) : $this->insertData($sequence);このコード行は注意深く理解する必要があります。

まず最初に、$this->exists という最初の属性が表示されます。この値をご存知ですか? はい、チェックするときに where 条件がある場合は、データを書き込む前に true に設定されます。下の図を参照してください。

ThinkPHP データベース クエリのモデルの詳細な分析
書き込む前にデータを確認してください

これにより、コードが実行されます $this->insertData( $sequence)このメソッドでは、何も注意を払っていません。主な焦点はデータを追加する方法です。

カカで囲まれた場所に注目してください。

ThinkPHP データベース クエリのモデルの詳細な分析
新しい書き込みデータを追加します

次に、コードはこのメソッドの挿入メソッドに来ます$this->parseOptions();これは、以前に分析された 分析式 (クエリまたは書き込み操作に使用できます) です。

ここではコネクタが使用されています。このコネクタは、このクラスのコンストラクターで依存関係注入を通じて注入されるオブジェクトです。

ThinkPHP データベース クエリのモデルの詳細な分析
レコードを挿入

すると、このファイルの thinkphp/library/think/db/Connection.php## に移動します。 #insert メソッド。

SQL ステートメントはすでに生成されているため、SQL ステートメントを実行するために

execute メソッドが呼び出されます。以下では、このメソッドを詳しく分析する新しいセクションを開始します。 。

Builder

クラスを通じて SQL ステートメントを生成し、バインドされたパラメーターを取得してクリアします。最後に、実行操作を使用して SQL ステートメントを実行します。

ThinkPHP データベース クエリのモデルの詳細な分析
レコードの挿入

3.execute 実行の詳細な分析

このケースは前のセクションで使用したケースです

ThinkPHP データベース クエリのモデルの詳細な分析
ケースのデモンストレーション

まず第一に、 # のパラメータを明確にする必要があります。 ##executeこのメソッド (このメソッドには 3 つのパラメーターがあり、主に 1 番目と 2 番目のパラメーターについて説明します)。

パラメータの値はコード コメントに配置されています。

ThinkPHP データベース クエリのモデルの詳細な分析パラメータをクリアします
次に段階的に分析します。最初に行うことは

$this->initConnect(true);##です。 #データベース接続の初期化。 このメソッドで知っておく必要があるのは、ここで何が判断されるのか、実際には

deploy

パラメーターが何であるかということです。

データベース接続の初期化ThinkPHP データベース クエリのモデルの詳細な分析
まず、このパラメータは構成ファイルから取得する必要があること、次に何を解析しているのかを明確にする必要があります。 now がデータベースである場合、このパラメータはデータベース構成ファイル内にある可能性が高くなります。

コードを分析した結果、データベース構成ファイル内にこの構成項目が見つかりました。この構成項目は、データベースのデプロイメント方法です。

0 集中型 (単一サーバー)、1 分散型 (マスター/スレーブ サーバー) この場合、または実際のプロジェクト運用では、フレームワーク内で分散データベースは使用されませんので、理解する必要はありません。 . .

ThinkPHP データベース クエリのモデルの詳細な分析
データベース構成ファイル

その後、コードは引き続き実行されます$this->linkID = $this->connect(); 、つまり、コメントによって与えられるヒントは、デフォルトの単一データベースです。

この方法では、Kaka のスクリーンショットが撮影された場所を使用して、データベース接続 ID が複数の接続をサポートしているかどうかを判断します。

そして2回目の判定では、このクラスのコンストラクタ内で事前に取得したパラメータ設定情報とデータベース設定ファイルを直接取得し、最終的にconfig属性に返します。

ThinkPHP データベース クエリのモデルの詳細な分析
接続データベース メソッド

次に、接続パラメータ ブロックの内容、このブロックの内容を解析し、構成情報内の params インデックス値を決定します。この値 構成ファイルは空の配列であるため、true を返します。

2 番目の配列かどうかの判定も true を返します。

つまり、この判定条件が成立し、if判定文が実行されることになります。

ここでの小さな知識ポイントは、演算子 かどうかについての知識です。

And: すべての条件が true の場合に true を返します

Or: 1 つの条件が true である限り true を返します

ThinkPHP データベース クエリのモデルの詳細な分析
接続パラメータ

上の図のこのクラスの属性paramsは事前に宣言されています。ここでは pdo を使用するだけで済みます。 mysql.パラメータに接続します。

PDOThinkPHP データベース クエリのモデルの詳細な分析
PDO 接続パラメータ

理解を容易にするために、Kaka はこのパラメータをすべての人に向けて印刷しました。下の図を参照してください。

PDOThinkPHP データベース クエリのモデルの詳細な分析#PDO 接続パラメータ
言い換えると、pdo パラメータは実際には宣言された一連の定数にすぎません。

次のステップでは、pdo を使用してデータベースに接続し、データベース接続の初期化がここで終了するまで、接続情報 (つまり

$this->linkID ) を返します。

ThinkPHP データベース クエリのモデルの詳細な分析pdo を使用してデータベースに接続します
その後、PDo 操作インスタンスを使用して実行されます

executeこのメソッドはビルドされています-in メソッドであり、最終的には OR を返し、レコード数に影響します。

4. 概要

このセクションでは、モデルに必要なファイルを理解することから始まり、次に動作を追加します。モデル ソースコードの詳細な解析動作。

ソースコードを解析する過程で、完全に説明されていない部分もありますが、重要な部分は通過しました。

最後に、execute メソッドを詳しく分析しました。なぜこのメソッドを分析する必要があるのですか? このメソッドはすべての操作の実行における最後のステップだからです。

学習の継続、ブログの継続、共有の継続は、カカがそのキャリア以来常に支持してきた信念です。巨大なインターネット上のカカの記事がそうであることを願っています」 Silk のお手伝いをします。私の名前はカカです。また次回お会いしましょう。

以上がThinkPHP データベース クエリのモデルの詳細な分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。