ferdirn/laravel-id-cities
Laravel package to create and seed an Indonesian cities (kota/kabupaten) table. Includes artisan commands to generate migrations and a seeder, plus optional config for table naming. Provides Cities service provider, facade, and ready-to-use city data.
Installation:
composer require ferdirn/laravel-id-cities:dev-master
Update config/app.php:
'providers' => [
Ferdirn\Cities\CitiesServiceProvider::class,
],
'aliases' => [
'Cities' => Ferdirn\Cities\CitiesFacade::class,
],
Publish Migrations:
php artisan vendor:publish --provider="Ferdirn\Cities\CitiesServiceProvider" --tag="migrations"
Run migrations:
php artisan migrate
First Use Case: Fetch all Indonesian cities via the facade:
$cities = Cities::all();
Or retrieve a single city by ID:
$city = Cities::find(1);
Data Retrieval:
// Get all cities
$allCities = Cities::all();
// Find by ID
$city = Cities::find(1);
// Get by province (if linked)
$jakartaCities = Cities::where('province_id', 31)->get();
City model directly for query building:
use Ferdirn\Cities\Models\City;
$cities = City::where('name', 'like', '%Jakarta%')->get();
Integration with Forms:
$provinces = Cities::getProvinces(); // If extended
$cities = Cities::where('province_id', $selectedProvince)->get();
<select name="city_id">
@foreach(Cities::all() as $city)
<option value="{{ $city->id }}">{{ $city->name }}</option>
@endforeach
</select>
API Responses:
return response()->json(Cities::all());
return Cities::where('province_id', request('province_id'))->get();
Seeding:
cities table during deployment:
php artisan db:seed --class=CitiesTableSeeder
Relationships:
// Example: Assume `City` has a `province()` relationship
$cityWithProvince = City::with('province')->find(1);
// Example: Attach cities to a `Location` model
public function cities()
{
return $this->morphToMany(City::class, 'cityable');
}
Caching:
$cities = Cache::remember('all_cities', now()->addHours(1), function () {
return Cities::all();
});
Localization:
// Extend the City model
class City extends \Ferdirn\Cities\Models\City
{
public function getNameAttribute($value)
{
return __($value); // Use Laravel's translation system
}
}
Validation:
use App\Rules\ValidCity;
$request->validate([
'city_id' => ['required', new ValidCity],
]);
class ValidCity implements \Illuminate\Contracts\Validation\Rule
{
public function passes($attribute, $value)
{
return Cities::find($value) !== null;
}
}
Migration Conflicts:
cities table, drop it first before publishing migrations to avoid conflicts.city_name vs. name).Dev-Master Dependency:
dev-master, which may introduce breaking changes. Pin a specific version if stability is critical:
composer require ferdirn/laravel-id-cities:1.0.0
Missing Relationships:
City model:
public function province()
{
return $this->belongsTo(Province::class);
}
Performance:
Cities::all()) can be slow. Use pagination or lazy loading:
$cities = Cities::paginate(20);
Facade vs. Model:
Cities::) and model (City::) are interchangeable, but the facade may not support all Eloquent methods. Prefer the model for complex queries.Data Integrity:
Missing Cities:
SQL Errors:
cities table exists and matches the expected schema. Run:
php artisan schema:dump
to inspect the table structure.Extend the Package:
City model to add custom methods:
class City extends \Ferdirn\Cities\Models\City
{
public function isCapital()
{
return $this->name === 'Jakarta';
}
}
Testing:
City model in tests:
$city = City::factory()->create(['name' => 'Bandung']);
RefreshDatabase trait for migration testing.Documentation:
README (e.g., "Cities are linked to provinces via province_id").Alternatives:
ferdirn/laravel-id-provinces and ferdirn/laravel-id-countries for a full geographic hierarchy.Local Development:
php artisan tinker to explore city data interactively:
php artisan tinker
>>> Cities::where('name', 'like', '%Surabaya%')->get();
How can I help you explore Laravel packages today?