masterix21/laravel-addressable

适用于任何 Eloquent 模型的地址

2.0.0 2024-09-23 10:03 UTC

This package is auto-updated.

Last update: 2024-09-23 10:07:18 UTC


README

MIT License Latest Version GitHub Tests Action Status Total Downloads

此包为任何 Eloquent 模型添加了地址:这样将更容易支持账单地址、发货地址或其他地址。

支持我们

如果你喜欢我的工作,你可以通过 赞助我

安装

你可以通过 composer 安装此包

composer require masterix21/laravel-addressable

你可以使用以下命令发布和运行迁移

php artisan vendor:publish --provider="Masterix21\Addressable\AddressableServiceProvider" --tag="migrations"
php artisan migrate

你可以使用以下命令发布配置文件

php artisan vendor:publish --provider="Masterix21\Addressable\AddressableServiceProvider" --tag="config"

使用方法

扩展 Eloquent 模型以支持地址很简单。

use Masterix21\Addressable\Models\Concerns\HasAddresses;

class User extends Model {
    use HasAddresses;
}

$user->shipments(); // morphMany of `Masterix21\Addressable\Models\Address` 

HasAddress 是一个通用特性,它将实现所有地址代码,但如果你想要处理发货地址或账单地址,还有其他两个特性。

use Masterix21\Addressable\Models\Concerns\HasBillingAddresses;
use Masterix21\Addressable\Models\Concerns\HasShippingAddresses;

class User extends Model {
    use HasBillingAddresses, 
        HasShippingAddresses;
}

$user->billingAddress(); // Primary billing address
$user->billingAddresses(); // All billing addresses

$user->shippingAddress(); // Primary shipment address
$user->shippingAddresses(); // All shipment addresses

标记和取消标记地址为主要地址

为了确保每个类型的地址只有一个“主要”地址,你可以使用 markPrimary() 方法。这将标记地址为主要地址,并将取消标记其他(同类型的)地址。

$shippingAddress->markPrimary(); // It will emit the events `AddressPrimaryMarked` and `ShippingAddressPrimaryMarked`
$shippingAddress->unmarkPrimary(); // It will emit the events `AddressPrimaryUnmarked` and `ShippingAddressPrimaryUnmarked`

$billingAddress->markPrimary(); // It will emit the events `AddressPrimaryMarked` and `BillingAddressPrimaryMarked`
$billingAddress->unmarkPrimary(); // It will emit the events `AddressPrimaryUnmarked` and `BillingAddressPrimaryUnmarked`

创建带位置的账单地址

$user->billingAddress()->create([
  'street_address1' => 'Via Antonio Izzi de Falenta, 7/C',
  'zip' => '88100',
  'city' => 'Catanzaro',
  'state' => 'CZ',
  'country' => 'Italy',
  'country_code' => 'IT',
  'position' => [
    'longitude' => 36.01010,
    'latitude' => 16.0129
  ]
]);

存储地址的经纬度

$billingAddress->position = new Point(38.90852, 16.5894); 
$billingAddress->save();

根据地址与另一个点的距离进行查询

// Take all addresses within 10 km
$addresses = Address::query()
  ->withPositionDistance(new Point(38.90852, 16.5894), 10000)
  ->get();

// Take all addresses over 10 km
$addresses = Address::query()
  ->withPositionDistance(new Point(38.90852, 16.5894), 10000, '>=')
  ->get();

测试

composer test

待办事项

  • 获取 X 公里范围内所有附近地址的方法

变更日志

请参阅 CHANGELOG 了解最近更改的更多信息。

贡献

请参阅 CONTRIBUTING 了解详细信息。

安全

如果你发现任何安全相关的问题,请通过电子邮件 l.longo@ambita.it 而不是使用问题跟踪器。

致谢

许可证

MIT 许可证(MIT)。请参阅 许可证文件 了解更多信息。