Installation:
composer require rinvex/laravel-addresses
php artisan rinvex:publish:addresses
php artisan migrate
rinvex_addresses table and its relationship with your models.First Use Case:
Attach an address to a User model:
use Rinvex\Addresses\Traits\HasAddresses;
class User extends Model
{
use HasAddresses;
}
// In a controller or service:
$user = User::find(1);
$user->addresses()->create([
'addressable_type' => 'App\Models\User',
'addressable_id' => $user->id,
'address' => '123 Main St',
'city' => 'Metropolis',
'postal_code' => '10001',
'country' => 'USA'
]);
Key Files:
config/addresses.php: Customize default fields or behaviors.app/Models/Address.php: Extend or modify the base Address model.Polymorphic Address Attachment:
HasAddresses trait on any Eloquent model (e.g., User, Vendor, Store).Vendor:
class Vendor extends Model
{
use HasAddresses;
}
$vendor->addresses()->create([...]);
Querying Addresses:
$user->addresses; // Collection of Address models
$user->addresses()->where('type', 'home')->get();
scopes):
$results = Address::search('Main St')->get();
Validation:
Address model’s rules() method:
// app/Models/Address.php
public static function rules()
{
return [
'address' => 'required|string|max:255',
'postal_code' => 'required|string|size:5',
// ...
];
}
API/Forms Integration:
rinvex/laravel-addresses with Form Requests or API Resources:
// Example API Resource
public function toArray($request)
{
return [
'addresses' => $this->addresses->map(function ($address) {
return $address->only(['address', 'city', 'postal_code']);
}),
];
}
Custom Fields:
addresses table via migrations or use the config/addresses.php to add custom fields:
// config/addresses.php
'fields' => [
'address',
'city',
'postal_code',
'country',
'type', // e.g., 'home', 'work'
'latitude', // Custom field
'longitude',
],
Geocoding:
creating observer or service:
$address->geocode(); // Hypothetical method; use a service like Google Maps API.
Soft Deletes:
Address model:
use SoftDeletes;
class Address extends Model
{
use SoftDeletes, HasAddresses;
}
deleted_at.Localization:
street, city) using Laravel’s localization features or a package like spatie/laravel-translatable.Testing:
$user = User::factory()->create();
$user->addresses()->create([...]);
$this->assertCount(1, $user->addresses);
Polymorphic Relationships:
addressable_type and addressable_id manually.HasAddresses trait’s built-in methods to avoid manual assignment:
$user->addAddress([...]); // Automatically sets polymorphic keys.
Migration Conflicts:
addresses table may conflict with published ones.php artisan rinvex:publish:addresses --force to overwrite existing files.Performance:
with() or load():
$users = User::with('addresses')->get();
Abandoned Package:
laravel-address or build a custom solution.Validation Overrides:
rules() method in your Address model or use Form Requests.Missing Addresses:
HasAddresses trait is properly used and the model is saved before attaching addresses.addressable_type, addressable_id) are set.Query Issues:
toSql() and dd() to inspect generated queries:
$query = $user->addresses()->where('city', 'Metropolis');
\Log::info($query->toSql(), $query->getBindings());
Configuration Errors:
config/addresses.php is properly published and configured:
'model' => \Rinvex\Addresses\Models\Address::class,
'fields' => [...],
Custom Address Types:
Address model to support custom types (e.g., "billing", "shipping"):
// app/Models/Address.php
protected $casts = [
'type' => 'string',
];
Observers:
Address::observe(AddressObserver::class);
class AddressObserver
{
public function creating(Address $address)
{
$address->type = request('type', 'home');
}
}
Scopes:
// app/Models/Address.php
public function scopeInCountry($query, $country)
{
return $query->where('country', $country);
}
Usage:
Address::inCountry('USA')->get();
API Resources:
public function toArray($request)
{
return [
'id' => $this->id,
'full_address' => "{$this->address}, {$this->city}, {$this->postal_code}",
'coordinates' => [
'lat' => $this->latitude,
'lng' => $this->longitude,
],
];
}
Testing Helpers:
Address for testing:
// app/Models/Address.php
public static function createTestAddress($attributes = [])
{
return static::create(array_merge([
'addressable_type' => 'App\Models\User',
'addressable_id' => 1,
'address' => 'Test Address',
'city' => 'Test City',
'postal_code' => '12345',
'country' => 'Test Country',
], $attributes));
}
How can I help you explore Laravel packages today?