Eloquent modely
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 kryptomienOdoslaní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.