다음 튜토리얼 칼럼은 Laravel에서 소개할 예정입니다. ChunkById 방식을 사용할 때 정렬을 하지 마세요! , 도움이 필요한 친구들에게 도움이 되길 바랍니다!
chunkById 방식 사용 시 정렬을 하지 말아주세요
최근 개발 작업을 하다가 이상한 문제가 발생하여 공유드리고자 합니다
문제 설명
으로 인해 데이터를 일괄적으로 처리해야 하는데, 이 데이터의 양이 너무 많아서 한꺼번에 꺼내어 실행하는 것은 비현실적입니다. 다행히 라라벨에서는 편리하게 처리할 수 있도록 ChunkById 메소드를 제공하고 있습니다. 의사 코드는 다음과 같습니다
Student::query() ->where('is_delete', false) ->orderBy('id', 'DESC') ->chunkById(200, function($students) { // 在这里进行逻辑处理 });
언뜻 보면 문제가 없지만 실제로 코드를 실행해 보면 ChunkById가 처음에만 실행되고 두 번째 이후에는 어떤 이유로 실행이 중지되는 것을 알 수 있습니다. 시간.
원인 찾기
라라벨 소스코드의 ChunkById 코드는 다음과 같습니다
public function chunkById($count, callable $callback, $column = null, $alias = null) { $column = is_null($column) ? $this->getModel()->getKeyName() : $column; $alias = is_null($alias) ? $column : $alias; $lastId = null; do { $clone = clone $this; $results = $clone->forPageAfterId($count, $lastId, $column)->get(); $countResults = $results->count(); if ($countResults == 0) { break; } if ($callback($results) === false) { return false; } $lastId = $results->last()->{$alias}; unset($results); } while ($countResults == $count); return true; }
while 루프는 $countResults == $count를 기준으로 판단하므로 이 두 변수를 덤프합니다. 그리고 우리는 이 두 가지가 처음으로 일치할 때, 두 번째로 일치하지 않는 데이터로 인해 프로그램이 중지된다는 것을 알게 될 것입니다.
위 코드에서 $count는 $results = $clone->forPageAfterId($count, $lastId, $column)->get();에 의해 획득됩니다.
forPageAfterId 메소드를 계속해서 살펴보세요
public function forPageAfterId($perPage = 15, $lastId = 0, $column = 'id') { $this->orders = $this->removeExistingOrdersFor($column); if (! is_null($lastId)) { $this->where($column, '>', $lastId); } return $this->orderBy($column, 'asc') ->take($perPage); }
We 여기에서 반환된 결과는 orderBy에 따라 오름차순으로 정렬되는 반면 원래 코드는 내림차순으로 정렬되어 개수가 일관되지 않게 되어 ChunkById 실행이 종료되는 것을 볼 수 있습니다.
Solution
이전 orderBy('id', 'desc')를 제거하세요.
Student::query() ->where('is_delete', false) ->chunkById(200, function($students) { // 在这里进行逻辑处理 });
요약
앞으로는 ChunkById나 Chunk 메소드를 사용할 때 커스텀 정렬을 추가하지 마세요
배우면서 배우게 될 것입니다. . .
위 내용은 ChunkById 방식을 사용할 때 정렬을 하지 마세요!의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

이 기사는 강력한 Laravel Restful API를 구축하는 사람들을 안내합니다. 프로젝트 설정, 리소스 관리, 데이터베이스 상호 작용, 직렬화, 인증, 인증, 테스트 및 중요한 보안 모범 사례를 다룹니다. 확장 성 도전 해결

이 기사는 Laravel에서 OAUTH 2.0 인증 및 승인을 구현하는 자세한 내용입니다. 리그/OAUTH2-SERVER 또는 제공자 별 솔루션과 같은 패키지를 사용하여 데이터베이스 설정 강조, 클라이언트 등록, 인증 서버 Configu

이 기사는 구성 요소를 사용하여 Laravel에서 재사용 가능한 UI 요소를 작성하고 사용자 정의하여 조직을위한 모범 사례를 제공하고 패키지 강화를 제안합니다.

이 기사는 클라우드 네이티브 환경에서 Laravel을 배포하기위한 모범 사례에 대해 설명하고 확장 성, 신뢰성 및 보안에 중점을 둡니다. 주요 문제로는 컨테이너화, 마이크로 서비스, 무국적 설계 및 최적화 전략이 포함됩니다.

이 기사는 Laravel에서 사용자 정의 블레이드 지시문을 만들고 사용하여 템플릿을 향상시키는 것에 대해 설명합니다. 지침 정의, 템플릿에서이를 사용하고 대규모 프로젝트에서 관리하고 개선 된 코드 재사용 성 및 R과 같은 이점을 강조합니다.

이 기사에서는 Laravel에서 사용자 정의 검증 규칙을 작성하고 사용하여이를 정의하고 구현하는 단계를 제공합니다. 재사용 성과 특이성과 같은 이점을 강조하고 Laravel의 검증 시스템을 확장하는 방법을 제공합니다.

PHP 프레임 워크를 선택할 때 Laravel과 Symfony는 가장 인기 있고 널리 사용되는 옵션 중 하나입니다. 각 프레임 워크는 자체 철학, 기능 및 강점을 테이블에 제공하여 다양한 프로젝트 및 사용 사례에 적합합니다.

이 기사는 Laravel의 최적 파일 업로드 및 클라우드 스토리지 전략을 살펴 봅니다. 로컬 스토리지 대 클라우드 제공 업체 (AWS S3, Google Cloud, Azure, DigitalOcean), 보안 강조 (유효성 검사, 소독, HTTP) 및 성능 OPTI를 검사합니다.


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

맨티스BT
Mantis는 제품 결함 추적을 돕기 위해 설계된 배포하기 쉬운 웹 기반 결함 추적 도구입니다. PHP, MySQL 및 웹 서버가 필요합니다. 데모 및 호스팅 서비스를 확인해 보세요.

SecList
SecLists는 최고의 보안 테스터의 동반자입니다. 보안 평가 시 자주 사용되는 다양한 유형의 목록을 한 곳에 모아 놓은 것입니다. SecLists는 보안 테스터에게 필요할 수 있는 모든 목록을 편리하게 제공하여 보안 테스트를 더욱 효율적이고 생산적으로 만드는 데 도움이 됩니다. 목록 유형에는 사용자 이름, 비밀번호, URL, 퍼징 페이로드, 민감한 데이터 패턴, 웹 셸 등이 포함됩니다. 테스터는 이 저장소를 새로운 테스트 시스템으로 간단히 가져올 수 있으며 필요한 모든 유형의 목록에 액세스할 수 있습니다.

PhpStorm 맥 버전
최신(2018.2.1) 전문 PHP 통합 개발 도구

드림위버 CS6
시각적 웹 개발 도구

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

뜨거운 주제



