"이 기사에서는 여러 필드를 동시에 늘리고 줄이는 방법에 대해 설명합니다
"
최근 샤오큐가 인터뷰를 하러 갔는데, 질문 문제는 동시에 여러 필드를 늘리고 줄이는 방법입니다.
리틀Q가 한동안 답변을 하지 못해서 최종 결과는 집에 가서 알림을 기다리는 것이었습니다....
카카가 이 질문에 대해 리틀Q에게 간단한 답변을 해줄 것입니다.
샤오큐에게 가장 친숙한 프레임워크는 ThinkPHP이므로 Kaka는 이 문제를 해결하기 위해 먼저 ThinkPHP를 사용할 것입니다.
먼저 이 문제를 해결하려면 프레임워크의 inc와 setInc에 대해 어느 정도 이해해야 합니다. 프레임워크에서는 이 두 함수를 사용하여 증가 또는 감소를 수행합니다.
하지만 둘 사이에는 차이점이 있습니다. inc는 Db 클래스의 메소드이고 setInc는 실제로 모델의 메소드를 호출하지만 결국 둘 다 thinkphp/library/think/db/Query.php
이 파일의 메서드입니다. thinkphp/library/think/db/Query.php
这个文件的方法。
这一块的源码咔咔就不看了,后边在说吧!先解决当下问题,小Q很着急的。
大家在写自增的方法时会不会跟小Q一样一直都使用的是setInc
setInc
, Xiao Q가 이 질문을 받았을 때 이런 생각을 했습니다. 🎜방문하면 무자비하게 나타나 리틀Q에게 극심한 일격을 가할 예정이다.
그래서 이 방법은 불가능하지만 그래도 이 기능을 구현하고 싶다면 어떻게 해야 할까요!
걱정하지 마세요. 카카가 여러분을 신세계로 데려갈 것입니다.
두 개의 inc 메소드를 직접 사용하여 여러 필드를 자동 증가 또는 감소시키면 Kaka의 아이디어는 소스 코드를 보는 것도 간단합니다.
아니면 thinkphp 프레임워크를 사용할 때 모두가 하나의 쿼리에 두 개의 where 메소드를 사용해 본 적이 있을 것입니다! 실제로 두 곳 모두 쿼리를 구현할 수 있기 때문에 아이디어는 동일합니다.
그러면 이 두 incs는 자동 증가 또는 자동 감소를 위한 여러 필드를 구현할 수도 있어야 합니다.
그래서 Kaka의 최종 솔루션은 위와 같은 솔루션입니다.
이 과정에서 카카는 여전히 지루한 inc 구현 과정을 겪었습니다.
아래 그림에서 매개변수에 대한 설명을 주로 살펴보면 첫 번째 매개변수가 배열일 수도 있고 문자열일 수도 있음을 알 수 있습니다.
그러나 코드에 따르면 여러 필드가 증가 또는 감소하도록 지원되지만 단계 크기는 하나의 값이라는 것을 알 수 있습니다.
그래서 프레임워크에서 제공하는 메소드는 可以同时自增或者自减多个字段,但是值只能是固定的
입니다.
여러 필드와 여러 단계를 구현하려면 소스 코드를 수정하여 이 문제를 해결해야 합니다.
다음은 Kaka가 소스 코드를 수정한 후의 내용입니다. inc 소스 코드의 그림과 비교할 수 있습니다.
카카가 수정한 소스코드는 소스코드에서 step의 값이 1로 직접 정의되어 있기 때문에 주로 원으로 둘러싸인 부분입니다.
따라서 이 블록을 수정하고 is_array를 사용하여 변수가 배열인지 감지해야 합니다.
위 작업 후에 여러 필드와 여러 단계에 대해 자체 증가 또는 자체 감소를 달성할 수 있습니다.
Kaka가 소스 코드를 직접 수정하는 것은 모든 사람에게 권장되지 않습니다. 문제에 대한 소스 코드에서 해결책을 찾는 방법만 배우면 됩니다.
따라서 여러 필드를 동시에 증가 및 감소시키는 방법에 대한 문제의 경우 옵션 1의 솔루션을 사용하는 것이 좋습니다.
결국 이런 상황은 극소수입니다. 프레임워크의 기본을 바꾸면 엉망이 됩니다.
문제를 해결하려면 이 섹션의 내용을 읽을 필요가 없습니다. 문제를 완벽하게 해결하려면 첫 번째 섹션만 읽으세요.
Kaka는 문제에 대해 생각하고 이를 해결하기 위해 다양한 솔루션을 사용하는 것을 좋아합니다.
그런 다음 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 문입니다. 테이블 이름과 필드가 변경되었으며, 늘리거나 줄여야 하는 필드로 직접 수정할 수 있습니다.
이 SQL 문을 사용하면 이 기사의 주제를 해결할 수 있으므로 Kaka는 인쇄 결과에 대한 일련의 스크린샷을 제공하지 않습니다. 관심이 있는 경우 직접 테스트할 수 있습니다.
말만 하고 가짜 동작을 연습하지 않아도 혼자서 연습을 많이 해야 한다는 말이 있죠.
위 내용은 기본 SQL을 사용하여 여러 필드와 여러 단계를 동시에 증가 및 감소시키는 프레임워크에서 구현됩니다.
이 문제는 실제로 매우 간단합니다. 프레임워크는 직접 호출하기만 하면 되는 해당 메서드도 제공합니다.
문제는 프레임워크에서 제공하는 자체 증가 또는 자체 감소 메서드 수를 알고 있다는 것입니다. 프레임워크는 inc 및 setInc라는 두 가지 메서드를 제공합니다.
setInc만 알고 있다면 당신은 패배자일 뿐입니다. 따라서 할 일이 없다면 소스 코드와 문서에 대해 자세히 읽어봐야 합니다. 이는 당신에게 좋은 일이 될 뿐 나쁜 일은 아닙니다.
또 다른 질문은 여러 필드의 동시 증가 및 감소를 달성하기 위한 새로운 방법의 사용을 언급하는 Kaka의 기사에 관한 것입니다. 이 방법은 프레임워크 하단에서 수정되었습니다.
이 구현 방법은 프레임워크의 맨 아래에서 두려움 없이 수정하는 것이 아니라 테스트 목적으로만 사용하고 소스 코드를 읽는 능력을 향상시키는 것입니다.
“배움에 대한 끈기, 블로깅에 대한 끈기, 공유에 대한 끈기는 카카가 경력 이후부터 지켜온 신념입니다. 거대한 인터넷에 올라온 카카의 글이 여러분에게 조금이나마 도움이 되기를 바랍니다. 카카 다음호에서 만나요
”
위 내용은 ThinkPHP에서 동시에 여러 필드를 증가 및 감소시키는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!