---
title: "Eloquent modely — Geolocation for Laravel | Roundly"
description: "Ukladajte hodnotový objekt Coordinates na ľubovoľný model cez trait HasLocation alebo CoordinatesCast a hľadajte blízke záznamy cez withinRadius()."
url: https://roundly-consulting.com/sk/open-source/navody/geolocation-for-laravel/eloquent-modely
language: sk
---

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

[Geolocation for Laravel](https://roundly-consulting.com/sk/open-source/navody/geolocation-for-laravel.md)

# Eloquent modely

Trait HasLocation pridá atribút coordinates nad stĺpcami latitude a longitude a query scope withinRadius():

```php
use Illuminate\Database\Eloquent\Model;
use RoundlyConsulting\Geolocation\Concerns\HasLocation;
use RoundlyConsulting\Geolocation\DataTransferObjects\Coordinates;

final class Store extends Model
{
    use HasLocation; // casts a `coordinates` attribute over `latitude`/`longitude` columns
}

$store = new Store;
$store->coordinates = new Coordinates(48.1486, 17.1077);
$store->save();

Store::query()->withinRadius(new Coordinates(48.15, 17.11), radiusKm: 5)->get();
```

Balík nemá vlastnú migráciu — oba stĺpce pridajte do svojej tabuľky:

```php
Schema::create('stores', function (Blueprint $table) {
    $table->id();
    $table->string('name');
    $table->float('latitude')->nullable();
    $table->float('longitude')->nullable();
});
```

- Čítanie coordinates vráti null, ak je ktorýkoľvek stĺpec null.
- Priradenie null vymaže oba stĺpce.
- Priradenie čohokoľvek iného ako inštancie Coordinates vyhodí InvalidCoordinatesException.
- coordinates sa pri každom čítaní zostaví zo stĺpcov, takže zmenu latitude / longitude po prečítaní coordinates uloženie nikdy nevráti späť.

## Presné dopyty v okruhu

withinRadius() filtruje ohraničujúcim obdĺžnikom, takže záznamy v jeho rohoch môžu ležať mierne mimo skutočného kruhu. Pri antimeridiáne zachytí dĺžky na oboch stranách ±180° a pri póle všetky dĺžky. Na presný výsledok ho skombinujte s kontrolou podľa Haversina:

```php
$center = new Coordinates(48.15, 17.11);

$nearby = Store::query()
    ->withinRadius($center, radiusKm: 5)   // cheap bounding-box pre-filter in SQL
    ->get()
    ->filter(fn (Store $store): bool => $store->coordinates?->near($center, radiusKm: 5) ?? false);
```

## Priame použitie castu

CoordinatesCast môžete použiť aj bez traitu alebo ho namapovať na inú dvojicu stĺpcov:

```php
use RoundlyConsulting\Geolocation\Casts\CoordinatesCast;

// Without the trait — latitude / longitude columns:
protected $casts = ['coordinates' => CoordinatesCast::class];

// A custom column pair (cast arguments map to latitudeColumn, longitudeColumn):
protected $casts = ['position' => CoordinatesCast::class.':lat,lng'];
```

Scope withinRadius() vždy filtruje podľa latitude a longitude, takže vlastné názvy stĺpcov fungujú s castom, no nie so scopom.

## 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/geolocation-for-laravel.md)
