ホームページ  >  記事  >  PHPフレームワーク  >  ThinkPHP で複数のフィールドを同時にインクリメントおよびデクリメントする方法

ThinkPHP で複数のフィールドを同時にインクリメントおよびデクリメントする方法

咔咔
咔咔オリジナル
2021-01-04 18:10:103382ブラウズ
#「この記事では、複数のフィールドを同時に増減する方法について説明します。

Xiao Q は最近面接に行き、複数のフィールドを同時に増減する方法について質問しました。

リトル Q はしばらく答えることができず、最終的には家に帰って通知を待つことになりました。....

カカはシャオ Q にこの質問に対する簡単な答えを与えます。

##Xiao Q が最もよく知っているフレームワークは

です。 ThinkPHP

の場合、Kaka はまず ThinkPHP を使用してこの問題を解決します。 まず、この問題を解決するには、フレームワークの inc と setInc についてある程度理解する必要があります。フレームワークでは、これら 2 つの関数はインクリメントまたはデクリメントに使用されます。

しかし、この 2 つには違いがあります。inc は Db クラスのメソッドであり、setInc は実際にはモデル内のメソッドを呼び出しますが、最終的には

thinkphp/library/think/db/クエリはこのファイルの .php

メソッドを使用します。

この作品のソース コードは読みません。後で説明します。まずは当面の問題を解決しましょう。シャオQはとても不安です。

自己増加メソッドを記述するとき、皆さんは Xiao Q のように常に

setInc

を使用しますか? Xiao Q がこの質問を受けたとき、これが考えたことです。

ThinkPHP で複数のフィールドを同時にインクリメントおよびデクリメントする方法
当初の予定

訪問すると容赦なく現れてリトルQに手痛い一撃を与えます。

ThinkPHP で複数のフィールドを同時にインクリメントおよびデクリメントする方法
エラー メッセージ

つまり、この方法は実行可能ではありませんが、それでもこの機能を実装したい場合はどうすればよいでしょうか。

心配しないでください。カカがあなたを新世界へ連れて行ってくれます。

2 つの inc メソッドを直接使用して複数のフィールドをインクリメントまたはデクリメントするため、KaKa のアイデアも単純にソース コードに基づいています。

ThinkPHP で複数のフィールドを同時にインクリメントおよびデクリメントする方法#最終解決策
あるいは、thinkphp フレームワークを使用するときに、誰もが 1 つのクエリで 2 つの where メソッドを使用したことがあるかもしれません。実際、どちらの where もクエリを実装できるため、考え方は同じです。

そうすれば、これら 2 つの inc は、自動インクリメントまたは自動デクリメント用の複数のフィールドも実装できるはずです。

つまり、Kaka の最終的な解決策は、上に示した解決策です。

2. ソース コードをめくります

#その過程でも、Kaka は株式会社について退屈な調査を続けました。実装プロセス。

下の図では、主にパラメータについて説明していますが、最初のパラメータが配列または文字列であることがわかります。

しかし、コードによれば、複数のフィールドの増減がサポートされているにもかかわらず、ステップ サイズは 1 つの値であることがわかります。

したがって、フレームワークによって提供されるメソッドは

です。これは複数のフィールドを同時に増減できますが、値は しか固定できません。

ThinkPHP で複数のフィールドを同時にインクリメントおよびデクリメントする方法
inc ソース コード

複数のフィールドと複数のステップを実装する場合は、この問題を解決するためにソース コードを変更する必要があります。

ThinkPHP で複数のフィールドを同時にインクリメントおよびデクリメントする方法
たとえば、複数のステップに対応する複数のフィールドを実装する場合、

ソース コードを変更した後の Kaka の内容は次のとおりです。 inc のソースコードの画像と比較してください。

Kaka が修正したソースコードは主に丸で囲んだ部分になります。これは、ソースコード内で step の値が 1 として直接定義されているためです。

したがって、このブロックを変更し、is_array を使用して変数が配列かどうかを検出する必要があります。

ThinkPHP で複数のフィールドを同時にインクリメントおよびデクリメントする方法
ソース コードを変更する

上記の操作を行うと、複数のフィールドおよび複数のステップに対して自己インクリメントまたは自己デクリメントを実現できます。

Kaka を使用してソース コードを直接変更することは誰にも推奨されません。問題に対してソース コード内で解決策を見つける方法を学ぶ必要があるだけです。

したがって、複数のフィールドを同時にインクリメントおよびデクリメントする方法の問題については、解決策 1 を使用することをお勧めします。

結局のところ、この状況は少数派であり、枠組みの根本を変えるとめちゃくちゃになります。

#3. SQL ステートメントを使用して実装する

問題を解決したい場合は、SQL ステートメントを使用する必要はありません。このセクションを読むには、はい、最初のセクションを見るだけで問題を完全に解決できます。

カカは、問題について考え、それを解決するために複数の解決策を使用することが好きです。

次に、Kaka は SQL ステートメントを使用して、この問題を詳細に分析します。

最初のセクションの実装計画をすべて実装しました。フレームワークには SQL ステートメントを直接出力できるメソッド fetchSql() があります。

それでは、この SQL ステートメントがどのようなものかを見てみましょう。

<span style="display: block; background: url(https://files.mdnice.com/point.png); height: 30px; width: 100%; background-size: 40px; background-repeat: no-repeat; background-color: #282c34; margin-bottom: -7px; border-radius: 5px; background-position: 10px 10px;"></span><code class="hljs" style="overflow-x: auto; padding: 16px; color: #abb2bf; display: -webkit-box; font-family: Operator Mono, Consolas, Monaco, Menlo, monospace; font-size: 12px; -webkit-overflow-scrolling: touch; padding-top: 15px; background: #282c34; border-radius: 5px;"><span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">UPDATE</span> <span class="hljs-string" style="color: #98c379; line-height: 26px;">`table`</span>  <span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">SET</span> <span class="hljs-string" style="color: #98c379; line-height: 26px;">`filed1`</span> = <span class="hljs-string" style="color: #98c379; line-height: 26px;">`filed1`</span> + <span class="hljs-number" style="color: #d19a66; line-height: 26px;">200</span> , <span class="hljs-string" style="color: #98c379; line-height: 26px;">`filed2`</span> = <span class="hljs-string" style="color: #98c379; line-height: 26px;">`filed2`</span> + <span class="hljs-number" style="color: #d19a66; line-height: 26px;">86</span>  <span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">WHERE</span>  <span class="hljs-string" style="color: #98c379; line-height: 26px;">`time`</span> <br/><span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">BETWEEN</span> <span class="hljs-number" style="color: #d19a66; line-height: 26px;">1609689600</span> <span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">AND</span> <span class="hljs-number" style="color: #d19a66; line-height: 26px;">1609775999</span><br/></code>

上記は、フレームワークが提供するメソッドを使用して出力された SQL ステートメントです。テーブル名とフィールド Kaka が変更されています。増加または減少する必要があるフィールドに直接変更できます。

ThinkPHP で複数のフィールドを同時にインクリメントおよびデクリメントする方法
ネイティブ SQL 実装ソリューション

この SQL ステートメントを使用すると、この記事のトピックを解決できるため、Kaka は印刷結果の一連のスクリーンショットを提供しませんでした。 . 興味があれば、自分で試してみることもできます。

よく言われるように、ただ話して、誤ったトリックを練習しないでください。

上記は、ネイティブ SQL を使用してフレームワークに実装され、複数のフィールドと複数のステップを同時に増減します。

概要

この問題は、本質的には非常に単純です。フレームワークには、対応するメソッドも用意されています。必要なのは、直接電話するだけです。

問題は、フレームワークによって提供される自己インクリメント メソッドまたは自己デクリメント メソッドがいくつあるかを知っていることです。フレームワークには、inc と setInc の 2 つのメソッドが提供されます。

setInc しか知らないとしたら、それは間違いではないでしょうか? 何もすることがない場合は、ソース コードとドキュメントについて詳しく読む必要があります。

もう 1 つの質問は、複数のフィールドの同時インクリメントとデクリメントを実現するための新しいメソッドの使用について言及している Kaka の記事に関するものですが、このメソッドはフレームワークの下部で変更されています。

この実装方法は推奨されません。ソース コードの変更は、フレームワークの下部に大胆な変更を加えるのではなく、テストとソース コードを読む能力を向上させるためだけに行われます。

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

以上がThinkPHP で複数のフィールドを同時にインクリメントおよびデクリメントする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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