Laravel's chunk() processes records in fixed-size batches (e.g., 1000 at a time) using LIMIT/OFFSET, while cursor() streams one record at a time via generators for minimal memory use on massive datasets.​
Use chunk(1000, callback) for batch operations like exports or jobs where you need related data with with(); switch to cursor() for memory-critical tasks like 1M+ record updates since it avoids loading collections entirely. Always pair with select() for essential columns only and chunkById() on mutable tables to prevent skips/duplicates.
.png)

.png)
