上記のディレクトリでは、Kaka はケースとしてクエリを使用しています。デモでは、メンテナンスが困難になるため、この使用はフレームワークでは推奨されません。
このセクションのケースは、フレームワークで一般的に使用されるデータベース クエリ方法を使用してクエリされます。
上の図では、最も一般的に使用されるクエリ メソッドが使用されていることがわかります。この一連のケースについて詳細な分析を実施します。
Db クラスの __callStatic
メソッドにも同じコードが記述されます。このメソッドは、宣言されていない静的メソッドを呼び出すときに実行されます。
このメソッドは __call メソッドとは異なります。__call メソッドは存在しないメソッドを呼び出します。この 2 つの違いに注意する必要があります。
上の図のメソッドの場合、static::connect()
は最終的に object( think \db\Query)
このオブジェクトは、内部処理の実行に関して、2番目のディレクトリの内容を参照できます。
したがって、実行プロセスは、thinkphp/library/think/db/Query.php
このクラスの table
メソッドになります。
パラメータは、tabletp_test
に渡されるデータベース テーブル名です。
上図のコードによると、渡されたテーブル名が3回判定されます。
テーブル メソッドでは、最終的な実行プロセスが、渡されたテーブル名を属性
options に格納することであることがわかります。
# を実行し、最終的に
think\db\Query Object オブジェクトを返します。
テーブル メソッド分析後完了しました where メソッドもクラス
thinkphp/library/think/db/Query.php内ですぐに実行されます。
上の図では、このクラスのメソッド func_get_args
が示されています。このメソッドは、関数パラメータを含む配列を返します。リストです。
このメソッドは通常、call_user_func_array
と一緒に使用されます。Kaka は以前、これら 2 つのメソッドを使用してケース実験を実施しました。
次に、関数 array_shift
を使用して、配列内の最初の要素 (赤色) を削除し、削除された要素の値を返します。
下の図の最初の結果は func_get_args
によって取得されたデータであり、2 番目の結果セットは array_shift
によって返された結果です。
2 つの結果セットによって返される値を比較すると、array_shift
の使用シナリオをよりよく理解できます。
次に、メソッド parseWhereExp# であるクエリ式が分析されます。 ##やる事。
コードの最初の行では、知識ポイントinstanceof
を学習する必要があります。
instanceof
オブジェクトが特定のクラスのインスタンスであるかどうか、およびオブジェクトが特定のインターフェイスを実装しているかどうかを判断できます。
この使用例については、記事「ThinkPHP ソース コード分析コントローラー
」で詳しく説明されています。
学習関数 instanceof
によれば、最初の判定は実行されないことがよくわかります。
次の実行プロセスの研究を続け、Kaka で囲まれたボックスに従ってコードの簡単な分析を実行します。
上図によると、クエリロジックの記号がすべて小文字に変換されます
その後、判定を行います$fieldinstanceofWhere
渡されたパラメータが Where クラスのインスタンスであるかどうか。
最後の判定は $フィールド インスタンスオブ式です。
これは前のステップと同じ機能です。
つまり、コードの最終的な実行ロジックは、下の図で丸で囲まれた部分になります。
この場合、where に渡されるパラメーターは配列であることに注意してください。
パラメータを where('t_id',1)
に変更すると、is_string($field)
のプロセスに従います。このプロセスは全員に任せます。クリックは解析されません。
ここでも、Kaka は解析用のパラメーターとして配列を使用しており、コードは引き続きこのクラスの parseArrayWhereItems
メソッドを実行します
このメソッドでは、まず key
が何を返すかを知り、現在の内部ポインターの位置から要素キー名を返す必要があります。
したがって、コードは if ステートメントの判定を実行します。上記のすべての判定によると、一貫性がないため、このコードが実行されます。$where[] = [$key, is_array ($val) ? 'IN ' : '=', $val];
このコードは、ループ配列の値が配列であるかどうかを判断します。配列の場合は in で、そうでない場合は = です。値が 1 であるため、配列の 2 番目の値は = です。
そして、where の最終値は、下の図に出力されるデータです。
where は空ではないため、コード実行処理は where まで実行されます。以下の図の位置を指定し、最後にこのクラスのインスタンスを返します。 # オプション属性にクエリ パラメータを格納する #その後もコードはこのクラスの find メソッドを実行して単一のレコードを検索します。 find ではパラメーターが渡されないため、コードは まで実行されます。今回のケースに関する限り、この一見長いコードはよく見ると理解できますが、最終的には現在のパラメータをすべて返します。 、 thisコードはファイル そして、戻り結果を宣言する必要はありません。上で述べたように、最終的な戻り結果が ##上図の戻り結果から、次のことがわかります。最終的には この方法により、最新のクエリのSQL文が取得されたことが分かります。 ここには、属性 上の図からわかるように、ここでは依存性注入が使用されているため、 したがって、この 次に、このクラスの 上図の継承関係によると、このメソッドは 下の図はこのメソッドの実行プロセスを示しており、パラメーターが 2 つあることがわかりますが、この 2 つのパラメーターが何なのかまだわかりません。 コード追跡に従って、まず、表示される 2 つのパラメーターを簡単に分析します。上の図の $this->queryStr の属性値を追跡する ここに来ると、おそらく少し混乱するでしょう。この値がちょっと不安で、印刷しても結果が得られません。 もちろん、ブレークポイント デバッグをデバッグする別の方法もあります。 しかし、カカはソースコードをみんなに見せているので!上記の 2 つの方法は使用せず、ソース コードから直接手がかりを見つけます。 Kaka が提供したケースによると、実行の最後のステップは find メソッドです。このメソッドはクラス それでは、この方法で少し検索してみますが、皆さんのここに丸が付いているカカ、下の写真のカカで囲った場所です。 上の図で Kaka が提供したコード コメントによると、最初のパラメータは生成された SQL です。ステートメントを続けて、このメソッドを確認してください。この時点では、このメソッドは引き続きファイル このメソッドでは、 したがって、この 以上は ここまでで、データベース内の Db クラスの動作シナリオとその組み合わせの分析が完了しました。コネクタ、クエリー、ジェネレーターの説明はここで終わります。 ここで、Kaka は主に 2 つのケースを実行に使用します。1 つ目はネイティブ ケース、2 つ目はフレーム カプセル化ケースです。 これら 2 つのケースは、ソース コードの詳細な分析を行うために使用されましたが、ドキュメントには多くの実装方法が記載されています。他の方法については、Kaka が提供するヒントに従って分析するだけで済みます。少しずつ。 すべてのメソッドを実行する必要はなく、どのメソッドを使用しても上記で解析したメソッドであり、これも非常に簡単です。 最後に、 このメソッドには属性値 学習の継続、ブログの継続、共有の継続は、Kaka が設立以来常に堅持してきた信念です。巨大なインターネット上の Kaka の記事が少しでもお役に立てれば幸いです。カカです、また会いましょう。 $this->parseOptions();
分析式 (クエリまたは書き込み操作に使用できます)thinkphp/library/think/db/Connection.php
に対して実行されます。<p style="box-sizing: border-box; margin-top: 0.8em; margin-bottom: 0.8em; font-size: 16px; padding-top: 8px; padding-bottom: 8px; line-height: 1.75; color: rgb(53, 53, 53); font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, " pingfang sc cambria cochin georgia times new roman serif letter-spacing: white-space: normal word-spacing: background-color: rgb>このコードから、データをクエリするときにフレームワークがデフォルトで 1 という制限を追加することがわかります。なぜこのように追加されるのかについては、SQL 最適化の知識を確認する必要があります。 </p>
<p><img src="https://img.php.cn/upload/image/255/922/331/1610338347974019.png" title="1610338347974019.png" alt="ThinkPHP の Db クラス ライブラリは、コネクタ、クエリ、SQL ジェネレータと組み合わせて使用されます。"></p>
<figure style="box-sizing: border-box; margin: 10px 0px; display: flex; flex-direction: column; justify-content: center; align-items: center; border-radius: 16px; overflow: hidden; color: rgb(53, 53, 53); font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, " pingfang sc cambria cochin georgia times new roman serif font-size: letter-spacing: white-space: normal word-spacing: background-color: rgb><figcaption style="box-sizing: border-box; margin-top: 5px; text-align: center; color: rgb(136, 136, 136); font-size: 12px;">単一レコードの検索</figcaption></figure><p style="box-sizing: border-box; margin-top: 0.8em; margin-bottom: 0.8em; font-size: 16px; padding-top: 8px; padding-bottom: 8px; line-height: 1.75; color: rgb(53, 53, 53); font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, " pingfang sc cambria cochin georgia times new roman serif letter-spacing: white-space: normal word-spacing: background-color: rgb>これは SQL ステートメントの生成に関するもので、コードを見れば理解できると思います。カカ 分析されるのは、実行プロセスと特定のコードを簡単に理解するだけです。 </p>
<p style="box-sizing: border-box; margin-top: 0.8em; margin-bottom: 0.8em; font-size: 16px; padding-top: 8px; padding-bottom: 8px; line-height: 1.75; color: rgb(53, 53, 53); font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, " pingfang sc cambria cochin georgia times new roman serif letter-spacing: white-space: normal word-spacing: background-color: rgb>具体的な実装プロセスについては、機会があれば後の段階でKakaが各メソッドを個別に詳細に分析する予定ですが、その際は主にコードの分析に焦点を当てます。 。 </p>
<p><img src="https://img.php.cn/upload/image/113/278/453/1610338342601897.png" title="1610338342601897.png" alt="ThinkPHP の Db クラス ライブラリは、コネクタ、クエリ、SQL ジェネレータと組み合わせて使用されます。"></p>
<figure style="box-sizing: border-box; margin: 10px 0px; display: flex; flex-direction: column; justify-content: center; align-items: center; border-radius: 16px; overflow: hidden; color: rgb(53, 53, 53); font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, " pingfang sc cambria cochin georgia times new roman serif font-size: letter-spacing: white-space: normal word-spacing: background-color: rgb><figcaption style="box-sizing: border-box; margin-top: 5px; text-align: center; color: rgb(136, 136, 136); font-size: 12px;">特定のルールに従って SQL ステートメントを生成し、クエリを実行します。</figcaption></figure><p style="box-sizing: border-box; margin-top: 0.8em; margin-bottom: 0.8em; font-size: 16px; padding-top: 8px; padding-bottom: 8px; line-height: 1.75; color: rgb(53, 53, 53); font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, " pingfang sc cambria cochin georgia times new roman serif letter-spacing: white-space: normal word-spacing: background-color: rgb>最終的な戻り結果は次のとおりです。</p>
<p> <img src="https://img.php.cn/upload/image/242/358/887/1610338336270934.png" title="1610338336270934.png" alt="ThinkPHP の Db クラス ライブラリは、コネクタ、クエリ、SQL ジェネレータと組み合わせて使用されます。"></p>
<figure style="box-sizing: border-box; margin: 10px 0px; display: flex; flex-direction: column; justify-content: center; align-items: center; border-radius: 16px; overflow: hidden; color: rgb(53, 53, 53); font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, " pingfang sc cambria cochin georgia times new roman serif font-size: letter-spacing: white-space: normal word-spacing: background-color: rgb><figcaption style="box-sizing: border-box; margin-top: 5px; text-align: center; color: rgb(136, 136, 136); font-size: 12px;">結果を返す</figcaption></figure><p style="box-sizing: border-box; margin-top: 0.8em; margin-bottom: 0.8em; font-size: 16px; padding-top: 8px; padding-bottom: 8px; line-height: 1.75; color: rgb(53, 53, 53); font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, " pingfang sc cambria cochin georgia times new roman serif letter-spacing: white-space: normal word-spacing: background-color: rgb>上記は、コネクタ、クエリー、ジェネレーターと組み合わせて Db によって実装されたデータベース クエリ関数についてです。 </p>
<p style="box-sizing: border-box; margin-top: 0.8em; margin-bottom: 0.8em; font-size: 16px; padding-top: 8px; padding-bottom: 8px; line-height: 1.75; color: rgb(53, 53, 53); font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, " pingfang sc cambria cochin georgia times new roman serif letter-spacing: white-space: normal word-spacing: background-color: rgb>Db シナリオの分析はここまでで、次に Kaka が Model の簡単な分析を行います。 </p>
<h1 style="box-sizing: border-box; margin-top: 30px; margin-bottom: 15px; color: black; padding: 0px; font-size: 1.3em; border-top: 2px solid rgb(248, 57, 41); text-align: center; font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, " pingfang sc cambria cochin georgia times new roman serif letter-spacing: white-space: normal word-spacing: background-color: rgb>
<span class="content" style="box-sizing: border-box; display: inline-block; font-weight: normal; background: rgb(248, 57, 41); color: rgb(255, 255, 255); padding: 3px 10px 1px; border-radius: 0px 0px 13px 13px;">2. getLastSql の実装プロセスについて</span><span class="suffix" style="box-sizing: border-box;"></span>
</h1>
<p style="box-sizing: border-box; margin-top: 0.8em; margin-bottom: 0.8em; font-size: 16px; padding-top: 8px; padding-bottom: 8px; line-height: 1.75; color: rgb(53, 53, 53); font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, " pingfang sc cambria cochin georgia times new roman serif letter-spacing: white-space: normal word-spacing: background-color: rgb>まだ前のケースですが、このメソッドを使用して結果を出力して確認してみましょうは。 </p>
<p><img src="https://img.php.cn/upload/image/252/151/721/1610338330790271.png" title="1610338330790271.png" alt="ThinkPHP の Db クラス ライブラリは、コネクタ、クエリ、SQL ジェネレータと組み合わせて使用されます。"></p>
<figure style="box-sizing: border-box; margin: 10px 0px; display: flex; flex-direction: column; justify-content: center; align-items: center; border-radius: 16px; overflow: hidden; color: rgb(53, 53, 53); font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, " pingfang sc cambria cochin georgia times new roman serif font-size: letter-spacing: white-space: normal word-spacing: background-color: rgb><figcaption style="box-sizing: border-box; margin-top: 5px; text-align: center; color: rgb(136, 136, 136); font-size: 12px;">印刷ケース</figcaption></figure><p style="box-sizing: border-box; margin-top: 0.8em; margin-bottom: 0.8em; font-size: 16px; padding-top: 8px; padding-bottom: 8px; line-height: 1.75; color: rgb(53, 53, 53); font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, " pingfang sc cambria cochin georgia times new roman serif letter-spacing: white-space: normal word-spacing: background-color: rgb>上の図を見ると、それがフレームワークによって最終的に生成された SQL ステートメントであることがわかります。をクリックし、この SQL ステートメントがどのように生成されるかを説明します。 </p>
<p style="box-sizing: border-box; margin-top: 0.8em; margin-bottom: 0.8em; font-size: 16px; padding-top: 8px; padding-bottom: 8px; line-height: 1.75; color: rgb(53, 53, 53); font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, " pingfang sc cambria cochin georgia times new roman serif letter-spacing: white-space: normal word-spacing: background-color: rgb>下の図は、このデモンストレーションのケースを示しています。下の図の丸で囲まれた領域です。 </p>
<p><img src="https://img.php.cn/upload/image/583/904/602/1610338324864603.png" title="1610338324864603.png" alt="ThinkPHP の Db クラス ライブラリは、コネクタ、クエリ、SQL ジェネレータと組み合わせて使用されます。"></p>
<figure style="box-sizing: border-box; margin: 10px 0px; display: flex; flex-direction: column; justify-content: center; align-items: center; border-radius: 16px; overflow: hidden; color: rgb(53, 53, 53); font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, " pingfang sc cambria cochin georgia times new roman serif font-size: letter-spacing: white-space: normal word-spacing: background-color: rgb><figcaption style="box-sizing: border-box; margin-top: 5px; text-align: center; color: rgb(136, 136, 136); font-size: 12px;">デモケース</figcaption></figure><p style="box-sizing: border-box; margin-top: 0.8em; margin-bottom: 0.8em; font-size: 16px; padding-top: 8px; padding-bottom: 8px; line-height: 1.75; color: rgb(53, 53, 53); font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, " pingfang sc cambria cochin georgia times new roman serif letter-spacing: white-space: normal word-spacing: background-color: rgb>上の図で丸で囲まれた領域からコードをトレースすると、ファイル <code style="box-sizing: border-box; font-size: 14px; font-family: " operator mono consolas monaco menlo monospace overflow-wrap: break-word padding: border-radius: margin: color: rgb background-color: rgba word-break: break-all>thinkphp/library/think/ にたどり着きます。 Db.php
を実行し、このクラスの __callStatic メソッドを実行します。このメソッドについては説明しません。これまでに何度も言及しています。 return object(think\db\Query)
object(think\db\Query)
このクラスの getLastSql
このメソッド connection# に関するいくつかの質問があります。 ## それは正確には何ですか? 以下に簡単な分析を示します。
Connection
はオブジェクトであり、またそのオブジェクトでもあります。 - コネクタと呼ばれます。 Connection
オブジェクトは以下のように出力されます。 getLastSql
メソッドが実行されます。 しかし、このクラスを実行してみると、このクラスにはそのようなメソッドがまったく存在しないことがわかります。
thinkphp/library/ にあることがわかります。 think/db /Connection.php
このクラス ファイル内。
$this->queryStr
現在の SQL コマンド$this->bind
バインディング パラメータthinkphp/library/think/db/Connection.php
にもあり、検索します単一のレコード。 thinkphp/library/think/db/Connection.php
に query
メソッドを実装します。このクラスの。 queryStr
属性の設定がこの属性に直接割り当てられていることが一目でわかります。つまり、この属性の値は、前の SQL ステートメント。 getLastSql
は、このステートメントの前に実行された SQL ステートメントを取得し、最後に実行された SQL ステートメントのみを取得できます。 SQL ステートメント。 getLastSql
の実装原理ですが、ここで注意が必要なのはSQLの生成であり、少し複雑です。
まとめ
getLastSql
を使用して最後に実行された SQL ステートメント クエリを取得する方法を示しました。ここでの実装原則は、主に Db クラスでデータベースを操作するときに find メソッドまたは select メソッドを使用することです。メソッドは最終的に 1 つのメソッド、つまりクエリ メソッドにつながります。 queryStr
もあります。つまり、この時点で SQL ステートメントが割り当てられ、getLastSql
メソッドが使用されます queryStr 属性と binding
属性は SQL を結合し、最終的に SQL ステートメントを返します。
以上がThinkPHP の Db クラス ライブラリは、コネクタ、クエリ、SQL ジェネレータと組み合わせて使用されます。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。