“ThinkPHP データベース クエリ Db メソッドについては上で説明しました。今日は、モデルの実装について簡単に説明します。 class.Method.
”
Model についても、次のとおりです。フレームワーク モデルの概念では、この使用法がフレームワークの使用量の大部分を占めます。
次に、Kaka は上記に基づいてモデルの詳細な分析を継続します。そのため、ベンチを準備してメロンの種を食べてこの記事を読んでください。
上で提供した Db クラスの実行フローチャートも誰でも公開されているので、よく理解しておくことができます。
モジュール ディレクトリにはモデル ディレクトリが必要です
次に、フレームワークの一番下には、モデル クラスに関するファイルが表示されますが、このクラスでは、これまでに学習した 2 つの知識ポイントが使用されます。
1 つ目は、ArrayAccess が配列のようにオブジェクトのプロパティにアクセスすることです。
2 番目の機能はスーパー クラス (トレイト) で、実際には多重継承に似た関数を実装しますが、PHP には多重継承がないため、2 つの概念を混同できないことに注意してください。
フレームワークの最下位にもモデル フォルダーがあり、このフォルダーも同じ機能を使用しますDb クラスとして。
例: コネクタ、クエリ、ジェネレーター
簡単に理解した後、次のことを理解する必要があります。モデル 1 つのケースを実装するために、1 つのケースが分析されました。
このケースでは、モデルのケース分析とソースコードの詳細な分析。
まず、モデル ファイルを作成する必要があります。Kaka は常にコマンド ラインを使用してファイルを作成します。コマンド ラインを使用してファイルを作成する利点は、作成時に名前空間を間違えるのを防ぐことです。ファイル。
次に、最初の関数を実装し、モデルを使用してそれを追加します。この部分の内容は非常に単純です。数回のクリック このステップはすべて非常に基本的なものですが、Kaka の主な仕事は全員の実装プロセスを分析することです。
コントローラー内のケースは以下の通りですが、ここでのKakaの書き方に注意してください。
Kaka がなぜこのように書くのか、そしてこの方法で書くことの利点について簡単に説明しましょう。
まず、モデル クラスを導入することが不可欠です。
次に、変数を宣言します。
最後のステップでは、コントローラーの初期化時に、宣言された変数にモデル クラスを割り当てます。
あとは宣言した変数を使用するだけでよいので、後からモデル名が競合した場合にコードの修正量を減らすことができるという利点があります。
モデル名をあらかじめ決めておき、後からモデル名を変更したいというシナリオも考えられますが、このときKakaさんの書き方に従えばコントローラーだけで済みます。初期化は 1 行のコードで実行できます。
それ以外の場合はコード全体を変更する必要があるため、Kaka はこのようにコードを記述しています。
まずは実行して、実行結果を見てみましょう。
上図の結果より、コードロジックに問題がないことが分かります。 saveメソッドを詳しく分析してモデルを見てみる Dbクラスの実行メソッドとの違いは何ですか?
save メソッドの詳細な分析
まず、このコードがどのファイルに実行されるかを理解する必要があります。
this$this->userModel
が次のクラスであることは誰もが知っています。モデル オブジェクトを選択したら、このモデル ファイルに直接アクセスして確認してください。
実際には、このファイルを読むかどうかは関係ありません。カスタマイズされたモデル ファイルは、モデル ファイル (この記事の冒頭で Kaka が示した、モデルで使用されるファイル) を継承する必要があります。 。
次に、フレームワークの下部にあるモデル クラスに進みます。thinkphp/library/think/Model.php ###。
チェックデータの詳細な分析を実行します。
$this->setAttr($key, $value, $data);
上の図によると、最終的な戻り結果は $this->checkBeforeSave($ data, $where)
、それが下の図です。
次について$result = $this->exists ? $this->updateData($ where) : $this->insertData($sequence);
このコード行は注意深く理解する必要があります。
まず最初に、$this->exists
という最初の属性が表示されます。この値をご存知ですか? はい、チェックするときに where 条件がある場合は、データを書き込む前に true に設定されます。下の図を参照してください。
これにより、コードが実行されます $this->insertData( $sequence)
このメソッドでは、何も注意を払っていません。主な焦点はデータを追加する方法です。
カカで囲まれた場所に注目してください。
次に、コードはこのメソッドの挿入メソッドに来ます$this->parseOptions();
これは、以前に分析された 分析式 (クエリまたは書き込み操作に使用できます)
です。
ここではコネクタが使用されています。このコネクタは、このクラスのコンストラクターで依存関係注入を通じて注入されるオブジェクトです。
すると、このファイルの thinkphp/library/think/db/Connection.php
## に移動します。 #insert メソッド。
execute メソッドが呼び出されます。以下では、このメソッドを詳しく分析する新しいセクションを開始します。 。
クラスを通じて SQL ステートメントを生成し、バインドされたパラメーターを取得してクリアします。最後に、実行操作を使用して SQL ステートメントを実行します。
このケースは前のセクションで使用したケースです
まず第一に、 # のパラメータを明確にする必要があります。 ##executeこのメソッド (このメソッドには 3 つのパラメーターがあり、主に 1 番目と 2 番目のパラメーターについて説明します)。
$this->initConnect(true);##です。 #データベース接続の初期化。 このメソッドで知っておく必要があるのは、ここで何が判断されるのか、実際には
パラメーターが何であるかということです。
コードを分析した結果、データベース構成ファイル内にこの構成項目が見つかりました。この構成項目は、データベースのデプロイメント方法です。
0 集中型 (単一サーバー)、1 分散型 (マスター/スレーブ サーバー) この場合、または実際のプロジェクト運用では、フレームワーク内で分散データベースは使用されませんので、理解する必要はありません。 . .
その後、コードは引き続き実行されます$this->linkID = $this->connect();
、つまり、コメントによって与えられるヒントは、デフォルトの単一データベースです。
この方法では、Kaka のスクリーンショットが撮影された場所を使用して、データベース接続 ID が複数の接続をサポートしているかどうかを判断します。
そして2回目の判定では、このクラスのコンストラクタ内で事前に取得したパラメータ設定情報とデータベース設定ファイルを直接取得し、最終的にconfig属性に返します。
次に、接続パラメータ ブロックの内容、このブロックの内容を解析し、構成情報内の params インデックス値を決定します。この値 構成ファイルは空の配列であるため、true を返します。
2 番目の配列かどうかの判定も true を返します。
つまり、この判定条件が成立し、if判定文が実行されることになります。
ここでの小さな知識ポイントは、演算子 と
かどうかについての知識です。
And: すべての条件が true の場合に true を返します
Or: 1 つの条件が true である限り true を返します
上の図のこのクラスの属性params
は事前に宣言されています。ここでは pdo を使用するだけで済みます。 mysql.パラメータに接続します。
理解を容易にするために、Kaka はこのパラメータをすべての人に向けて印刷しました。下の図を参照してください。
言い換えると、pdo パラメータは実際には宣言された一連の定数にすぎません。 次のステップでは、pdo を使用してデータベースに接続し、データベース接続の初期化がここで終了するまで、接続情報 (つまり$this->linkID ) を返します。
executeこのメソッドはビルドされています-in メソッドであり、最終的には OR を返し、レコード数に影響します。
ソースコードを解析する過程で、完全に説明されていない部分もありますが、重要な部分は通過しました。
最後に、execute
メソッドを詳しく分析しました。なぜこのメソッドを分析する必要があるのですか? このメソッドはすべての操作の実行における最後のステップだからです。
「学習の継続、ブログの継続、共有の継続は、カカがそのキャリア以来常に支持してきた信念です。巨大なインターネット上のカカの記事がそうであることを願っています」 Silk のお手伝いをします。私の名前はカカです。また次回お会いしましょう。
”
以上がThinkPHP データベース クエリのモデルの詳細な分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。