Skip to content

Collections

Learn how to work with collections of Dtos using DataCollection.

Collections allow you to work with multiple Dto instances as a group:

$users = UserDto::collection($userArray);
// DataCollection of UserDto instances
$users->filter(fn($user) => $user->age > 18);
$users->map(fn($user) => $user->name);
$users->first();
$users->count();
use Tests\Utils\Docu\Dtos\UserDto;
$data = [
['name' => 'John', 'age' => 25],
['name' => 'Jane', 'age' => 30],
];
$users = UserDto::collection($data);
// Result: DataCollection of UserDto instances
$users = User::all();
$dtos = UserDto::collection($users);
use event4u\DataHelpers\SimpleDto\DtoCollection;
use Tests\Utils\Docu\Dtos\UserDto;
$data = [
['name' => 'John', 'email' => 'john@example.com', 'age' => 30],
['name' => 'Jane', 'email' => 'jane@example.com', 'age' => 25],
];
$collection = DtoCollection::make($data, UserDto::class);
use Tests\Utils\Docu\Dtos\UserDto;
$data = [
['name' => 'John', 'age' => 25],
['name' => 'Jane', 'age' => 17],
['name' => 'Bob', 'age' => 30],
];
$users = UserDto::collection($data);
$adults = $users->filter(fn($user) => $user->age >= 18);
// Result: DataCollection with 2 items (John and Bob)
use Tests\Utils\Docu\Dtos\UserDto;
$data = [
['name' => 'John', 'age' => 25],
['name' => 'Jane', 'age' => 17],
['name' => 'Bob', 'age' => 30],
];
$users = UserDto::collection($data);
$adults = $users->filter(fn($user) => $user->age > 18);
$mapped = $adults->map(fn($user) => UserDto::fromArray([
'name' => strtoupper($user->name),
'age' => $user->age,
]));
// Result: DtoCollection with uppercase names for adults (JOHN and BOB)
use Tests\Utils\Docu\Dtos\UserDto;
$data = [
['name' => 'John', 'age' => 25],
['name' => 'Jane', 'age' => 30],
];
$users = UserDto::collection($data);
$first = $users->first();
$last = $users->last();
// Result: $first->name = 'John', $last->name = 'Jane'
use Tests\Utils\Docu\Dtos\UserDto;
$data = [
['name' => 'John', 'age' => 25],
['name' => 'Jane', 'age' => 30],
];
$users = UserDto::collection($data);
$count = $users->count();
// Result: 2
use Tests\Utils\Docu\Dtos\UserDto;
$data = [
['name' => 'John', 'age' => 25],
['name' => 'Jane', 'age' => 30],
];
$users = UserDto::collection($data);
$array = $users->toArray();
// Result: [['name' => 'John', 'age' => 25], ['name' => 'Jane', 'age' => 30]]
$paginated = UserDto::paginatedCollection($users, page: 1, perPage: 10);
// [
// 'data' => [...],
// 'meta' => [
// 'current_page' => 1,
// 'per_page' => 10,
// 'total' => 100,
// 'last_page' => 10,
// ],
// ]
$users = User::paginate(10);
$dtos = UserDto::collection($users);
class OrderDto extends SimpleDto
{
public function __construct(
public readonly int $orderId,
public readonly DataCollection $items, // Collection of OrderItemDto
) {}
}
$order = OrderDto::fromArray([
'orderId' => 123,
'items' => [
['product' => 'Widget', 'quantity' => 2],
['product' => 'Gadget', 'quantity' => 1],
],
]);
// ✅ Good - with type hint
public readonly DataCollection $items;
// ❌ Bad - no type hint
public readonly $items;
// ✅ Good - use collection methods
$adults = $users->filter(fn($user) => $user->age >= 18);
// ❌ Bad - manual loop
$adults = [];
foreach ($users as $user) {
if ($user->age >= 18) {
$adults[] = $user;
}
}

The following working examples demonstrate this feature:

All examples are fully tested and can be run directly.

The functionality is thoroughly tested. Key test files:

Run the tests:

Terminal window
# Run tests
task test:unit -- --filter=Collection