“
本文將帶大家聊一下如何同時自增自減多個字段
”
前言
最近小Q同學去面試了,然后就問了題目的問題,如何同時自增自減多個字段。
小Q一時回答不出來,最終的結果就是回家等通知….
關于這個問題咔咔來給小Q簡單的進行解答一下。
一、thinkphp框架實現
小Q最熟悉的框架就是ThinkPHP,那么咔咔就先使用ThinkPHP來解決這個問題。
首先,解決這個問題需要對框架的inc和setInc有一定的了解,在框架中也就是使用這倆個函數進行自增或者自減的。
但是倆者是有區別的,inc是Db類中的方法,setInc實際調用的是模型中的方法,但是最終都使用的是thinkphp/library/think/db/Query.php這個文件的方法。
這一塊的源碼咔咔就不看了,后邊在說吧!先解決當下問題,小Q很著急的。
大家在寫自增的方法時會不會跟小Q一樣一直都使用的是setInc,小Q拿到這個問題時是這樣想的。
當訪問時會無情的出現給小Q一個沉痛一擊。
于是這種方式是不可行的,但是還是想實現這個功能怎么辦呢!
不著急咔咔帶你訪問新大陸。
直接使用倆個inc方法來進行對多字段自增或者自減,那么咔咔這個思路也是簡單的看源碼來的。
又或者大家應該都在使用thinkphp框架時都在一個查詢中使用過倆個where方法吧!其實思路都一樣既然倆個where都可以實現查詢。
那么那倆個inc應該也會是可以實現多個字段進行自增或者自減的。
所以說咔咔最后的解決方案就是如上圖的解決方案。
二、翻騰一下源碼
在這個過程中咔咔還是去無聊的翻騰了一下關于inc的實現過程。
在下圖中主要看關于參數給予的解釋,可以看到第一個參數是可以為數組或者字符串的。
但是在根據代碼會發現,雖然支持多個字段自增或者自減但是步長卻是一個值。
所以說框架給提供的這個方法是可以同時自增或者自減多個字段,但是值只能是固定的。
如果想要實現多個字段多個步長就需要來修改源碼來解決這個問題。
以下是咔咔修改源碼后的內容,可以跟inc源碼那一幅圖做對比。
咔咔修改的源碼主要為圈到的地方,因為step這個值在源碼中是直接給定義為1了。
所以就需要修改這一塊,使用is_array來進行檢測這個變量是否為數組就可以了。
經過以上的操作就可以實現針對多個字段多個步長進行自增或者自減了。
咔咔這種直接修改源碼是不建議大家借鑒的,只是針對一個問題我們要學會去在源碼中找到解決方案。
所以說針對如何同時自增自減多個字段這個問題咔咔還是建議使用方案一的解決方法。
畢竟這種情況是屬于少數的,在框架基礎改著改著自己都會亂。
三、使用SQL語句進行實現
如果為了解決問題這一節的內容就不用在看了,看第一節就可以完美的解決你的問題了。
咔咔是喜歡琢磨一個問題使用多種方案進行解決。
那么接下來咔咔再使用SQL語句對這個問題進行深度的解析。
既然咱們都已經在第一節中將實現方案都已經實現了,在框架中有一個方法fetchSql(),可以直接打印出sql語句。
那么就來看一下這個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><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>