---
title: "Poskytovatelia obsadenosti — Opening Hours for Laravel | Roundly"
description: "Napájajte dostupnosť z Eloquent dotazov, polí, closures alebo vlastného poskytovateľa — bez väzby na akýkoľvek rezervačný balík."
url: https://roundly-consulting.com/sk/open-source/navody/opening-hours-for-laravel/obsadene-obdobia
language: sk
---

[Všetky balíky](https://roundly-consulting.com/sk/open-source.md)

[Opening Hours for Laravel](https://roundly-consulting.com/sk/open-source/navody/opening-hours-for-laravel.md)

# Poskytovatelia obsadenosti

Obsadený čas pochádza z BusyPeriodProvider, z iterable s BusyPeriod::make($start, $end, weight: 1) alebo z closure. Balík obsahuje päť poskytovateľov: ArrayBusyPeriodProvider, ClosureBusyPeriodProvider, CompositeBusyPeriodProvider, NullBusyPeriodProvider a EloquentBusyPeriodProvider.

## Z Eloquent dotazu

EloquentBusyPeriodProvider prevedie akýkoľvek dotaz na obsadené obdobia — namapujte stĺpce, ošetrite riadky bez konca a uveďte, v akom pásme sú surové hodnoty uložené:

```php
use RoundlyConsulting\OpeningHours\Availability\Providers\EloquentBusyPeriodProvider;
use RoundlyConsulting\OpeningHours\Facades\OpeningHours;

$busy = EloquentBusyPeriodProvider::for(
        Appointment::query()->where('vet_id', $vet->id)->whereNotIn('status', ['cancelled']),
    )
    ->columns(start: 'starts_at', end: 'ends_at')
    ->durationColumn('duration_minutes')   // rows with a NULL end last this many minutes
    ->defaultDuration(minutes: 30)         // … or this, when the duration is NULL too
    ->maxNullEndMinutes(480)               // optional: the longest possible duration
    ->weightColumn(null)                   // or a column with capacity units
    ->storedIn('UTC');                     // timezone of the raw column values

OpeningHours::for($clinic)->availability()->withBusyPeriods($busy)->isAvailable($start, $end);
```

- columns(start:, end:) — stĺpce začiatku a konca.
- durationColumn() — riadky s koncom NULL trvajú toľkoto minút; defaultDuration(), keď je NULL aj dĺžka (alebo stĺpec dĺžky chýba).
- weightColumn() — stĺpec s jednotkami kapacity na riadok (null = váha 1).
- maxNullEndMinutes() — voliteľne najdlhšia možná dĺžka. Riadok s koncom NULL môže zasiahnuť do okna, len ak začal najviac o svoju dĺžku skôr; bez tejto hranice ju provider zistí jedným dopytom MAX(duration) navyše pri každom čítaní (alebo použije defaultDuration(), ak stĺpec dĺžky chýba). Nastavte ju, aby ste tento dopyt ušetrili — nikdy nie nižšie, než je vaša najdlhšia dĺžka, inak sa dlhšie rezervácie prehliadnu a budú vyzerať ako voľné.
- storedIn() — časové pásmo surových hodnôt v stĺpcoch (predvolene app.timezone). Odporúčame ukladať časy rezervácií v UTC.

Názvy stĺpcov sa validujú voči povolenému vzoru a hodnoty sa viažu ako parametre. Poskytovateľ vyberá len uvedené stĺpce, čítanie obmedzí na limits.busy\_periods a hodnoty miestneho času okolo zmeny času vyhodnotí rovnakým pravidlom hraníc ako engine.

## Kombinovanie zdrojov

```php
use RoundlyConsulting\OpeningHours\Availability\BusyPeriod;
use RoundlyConsulting\OpeningHours\Availability\Providers\ArrayBusyPeriodProvider;
use RoundlyConsulting\OpeningHours\Availability\Providers\CompositeBusyPeriodProvider;
use RoundlyConsulting\OpeningHours\Facades\OpeningHours;

$maintenance = new ArrayBusyPeriodProvider([
    BusyPeriod::make($start, $end, weight: 2, reference: 'maintenance'),
]);

OpeningHours::for($clinic)->availability()
    ->withBusyPeriods(new CompositeBusyPeriodProvider($busy, $maintenance))   // the union of both
    ->isAvailable($from, $to);
```

## Vlastný poskytovateľ

Implementujte BusyPeriodProvider::busyPeriodsBetween() a vráťte obdobia, ktoré sa prekrývajú s oknom. Vrátiť viac nevadí — engine ich oreže:

```php
use Carbon\CarbonImmutable;
use RoundlyConsulting\OpeningHours\Availability\BusyPeriod;
use RoundlyConsulting\OpeningHours\Contracts\BusyPeriodProvider;

final class MaintenanceWindows implements BusyPeriodProvider
{
    public function busyPeriodsBetween(CarbonImmutable $start, CarbonImmutable $end): iterable
    {
        return MaintenanceWindow::query()
            ->where('starts_at', '<', $end)
            ->where('ends_at', '>', $start)
            ->get()
            ->map(fn (MaintenanceWindow $window) => BusyPeriod::make($window->starts_at, $window->ends_at));
    }
}
```

BusyPeriod musí končiť po svojom začiatku a mať váhu aspoň 1 (InvalidBusyPeriodException); viac ako limits.busy\_periods pri jednom vyhodnotení vyhodí TooManyBusyPeriodsException.

## Prejavte lásku k open source

Tento balík je zadarmo pod licenciou MIT. Ak vám šetrí čas, jednorazový príspevok alebo členstvo na Patreone nám pomôže ho ďalej udržiavať, testovať a dokumentovať.

[Ďalšie spôsoby podpory vrátane kryptomien](https://roundly-consulting.com/sk/podporte-nas.md)

Odoslaním daru súhlasíte s našimi [podmienkami prijímania darov](https://roundly-consulting.com/sk/podmienky-darov.md).

[Podporte našu open-source prácu (otvorí sa v novej karte)](https://donate.stripe.com/dRmeVe8FX5PF1Qd9pXcEw00) [Pridajte sa k nám na Patreone (otvorí sa v novej karte)](https://www.patreon.com/cw/roundly)

## Chcete to zabudovať do svojho produktu?

Naše balíky integrujeme do zákazkových Laravel a AI riešení. Napíšte nám, na čom pracujete, a ozveme sa do 48 hodín.

[Ponuka do 48 hodín](https://roundly-consulting.com/sk/kontakt.md) [Prezrieť všetky balíky](https://roundly-consulting.com/sk/open-source/navody/opening-hours-for-laravel.md)
