NovinkaZverejnili sme 50+ Laravel balíkov ako open source
Custom AI apps, agents and automation — Roundly ConsultingRoundly
Všetky balíky

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

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:

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.

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:

$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:

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

Odoslaním daru súhlasíte s našimi podmienkami prijímania darov.

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.