lastdragon-ru / lara-asp-eloquent
The Awesome Set of Packages for Laravel - Eloquent Helpers.
Requires
- php: ^8.0|^8.1|^8.2
- laravel/framework: ^9.0.0|^10.0.0
- lastdragon-ru/lara-asp-core: 4.2.1
Requires (Dev)
- ext-pdo_sqlite: *
- lastdragon-ru/lara-asp-testing: 4.2.1
- orchestra/testbench: ^6.9.0|^7.0.0|^8.0.0
- phpunit/phpunit: ^9.5.0|^10.1.0
Suggests
- ext-fileinfo: Required for league/flysystem
This package is auto-updated.
Last update: 2023-05-15 06:55:17 UTC
README
This package is the part of Awesome Set of Packages for Laravel.
This package contains useful extensions and mixins for Eloquent.
Installation
composer require lastdragon-ru/lara-asp-eloquent
Iterators
Iterators are similar to Builder::chunk()
but uses generators instead of \Closure
that makes code more readable:
$query = \App\Models\User::query(); $query->chunk(100, function ($users) { foreach ($users as $user) { // ... } }); foreach ($query->getChunkedIterator() as $user) { // ... }
Iterators also support limit/offset, by default it will try to get them from the Builder, but you can also set them by hand:
$query = \App\Models\User::query()->offset(10)->limit(20); foreach ($query->getChunkedIterator() as $user) { // ... 20 items from 10 } foreach ($query->getChunkedIterator()->setOffset(0) as $user) { // ...20 items from 0 }
When you use the default ChunkedIterator
you should not modify/delete the items while iteration or you will get unexpected results (eg missing items). If you need to modify/delete items while iteration you can use ChunkedChangeSafeIterator
that specially created for this case and unlike standard chunkById()
it is always safe (please see laravel/framework#35400 for more details). But there are few limitations:
- it is not possible to sort rows, they always will be sorted by
column asc
; - the
column
should not be changed while iteration or this may lead to repeating row in results; - the row inserted while iteration may be skipped if it has
column
with the value that lover than the internal pointer; - queries with UNION is not supported;
offset
from Builder will not be used;
To create a change safe instance you can use:
$query = \App\Models\User::query(); foreach ($query->getChangeSafeIterator() as $user) { // ... }
Mixins
\Illuminate\Database\Eloquent\Builder
Name | Description |
---|---|
orderByKey(string $direction = 'asc') |
Add an ORDER BY primary_key clause to the query. |
orderByKeyDesc() |
Alias of orderByKey('desc') |
getChunkedIterator() |
Return ChunkedIterator instance. |
getChangeSafeIteratorIterator() |
Return ChunkedChangeSafeIterator instance. |