Генерація послідовних колекцій у Laravel

0
Перекладено ШІ
Оригінал: Laravel News
Оновлено: 15 січня, 2025
Вам цікаво дізнатися, як легко згенерувати колекцію з обчисленими значеннями в Laravel? У нашій статті ми розглянемо метод `times`, який стане вам у пригоді для створення послідовностей, вилучення вільних часових слотів і не тільки

Коли вам потрібно створити колекцію з певною кількістю обчислених елементів, метод times у Laravel стає елегантним розв'язанням. Цей метод особливо корисний для генерування послідовностей, часових слотів, лінків для пагінації або в будь-якому випадку, що вимагає нумерованих ітерацій.

// Генеруємо таблицю множення на 5
$fives = Collection::times(10, function ($number) {
    return $number * 5;
});
// [5, 10, 15, 20, 25, 30, 35, 40, 45, 50]

Розглянемо практичний приклад розробки планувальника зустрічей, який генерує доступні часові слоти:

<?php
 
namespace App\Services;
 
use Carbon\Carbon;
use Illuminate\Support\Collection;
 
class MeetingScheduler
{
    public function generateTimeSlots(Carbon $date, array $config = []): Collection
    {
        $startTime = $config['start_time'] ?? '09:00';
        $endTime = $config['end_time'] ?? '17:00';
        $duration = $config['duration'] ?? 30;
 
        $slots = $this->calculateSlotCount($startTime, $endTime, $duration);
        return Collection::times($slots, function ($slot) use ($date, $startTime, $duration) {
            $start = Carbon::parse($date->format('Y-m-d') . ' ' . $startTime)
                ->addMinutes(($slot - 1) * $duration);
 
            $end = $start->copy()->addMinutes($duration);
            return [
                'id' => $slot,
                'start_time' => $start->format('H:i'),
                'end_time' => $end->format('H:i'),
                'formatted' => sprintf(
                    '%s - %s',
                    $start->format('g:i A'),
                    $end->format('g:i A')
                ),
                'is_available' => !$this->isSlotBooked($start, $end)
            ];
        });
    }
 
    private function calculateSlotCount($start, $end, $duration): int
    {
        $startMinutes = Carbon::parse($start)->diffInMinutes(Carbon::parse($end));
        return (int) floor($startMinutes / $duration);
    }
 
    private function isSlotBooked(Carbon $start, Carbon $end): bool
    {
        // Перевірка на наявність уже заброньованих слотів
        return false;
    }
}

Метод times спрощує створення послідовних даних, забезпечуючи чистий та ефективний спосіб формування колекцій з обчисленими значеннями

Популярні

Logomark Logotype

Журнал аудиту в Laravel

Хочете забезпечити повну прозорість у своїх Laravel-додатках? Пакет Laravel Audit Log допоможе вам детально відстежувати всі зміни моделей Eloquent та відповідати вимогам регуляторів. Читайте далі, щоб дізнатися, як цей потужний інструмент може підвищити надійність вашого проєкту

Logomark Logotype

Створення CLI-додатка за допомогою Laravel та Docker

Зазирніть у світ Laravel, де потужний CLI-фреймворк відкриває нові можливості для розробки командного інтерфейсу. Дізнайтеся, як створити просту утиліту для перевірки акцій, яка працює з Docker, та які переваги це може принести у вашому проєкті!

Logomark Logotype

Випущено Livewire 3.6

Laravel Livewire випустив нову версію 3.6, яка приносить з собою цікаві HTML-директиви для управління видимістю DOM-елементів і JavaScript-діями. Досліджуйте нові можливості Livewire, що допоможуть вам створити ще більш інтерактивні користувацькі інтерфейси!