Be part of JetBrains PHPverse 2026 on June 9 – a free online event bringing PHP devs worldwide together.

Farids78's avatar

Add faker city with php faker

Hi, I'm already using php library faker to create fake users with a seeder but I would like to assign real cities to user country. Currently, cities affected to countries are all wrong like example below "Port Donnabury" ,France where "Port Donnabury" is not a french city.

I tried this code below but I'm facing issue "Target class [faker] does not exist when I try to run the seeder.

As I'm using faker for lat&long maybe there is another way to create real lat&long data according to user country code?

My app.php files include differents locales :

'faker_locales' => [
    'fr_FR',
    'en_US',
    'es_ES',
    'es_CO',
    'es_MX',
    'en_GB',
    'de_DE',
],
namespace Database\Factories;

use Illuminate\Database\Eloquent\Factories\Factory;
use Illuminate\Support\Facades\Hash;
use Faker\Provider\Geo\FrCitiesProvider;
use Faker\Provider\Geo\UsCitiesProvider;
use Faker\Provider\Geo\EsCitiesProvider;
use Faker\Provider\Geo\CoCitiesProvider;
use Faker\Provider\Geo\MxCitiesProvider;
use Faker\Provider\Geo\BeCitiesProvider;
use Faker\Provider\Geo\GbCitiesProvider;

/**
 * @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\User>
 */
class UserFactory extends Factory
{
  /**
   * Define the model's default state.
   *
   * @return array<string, mixed>
   */
  public function definition()
  {
    $country_codes =['+33', '+1', '+34', '+57', '+52', '+44', '+49'];
    shuffle($country_codes);
    $phonePrefix = $country_codes[0]; 

    $faker = app()->faker;

    $faker->addProvider(new FrCitiesProvider($faker));
    $faker->addProvider(new UsCitiesProvider($faker));
    $faker->addProvider(new EsCitiesProvider($faker));
    $faker->addProvider(new CoCitiesProvider($faker));
    $faker->addProvider(new MxCitiesProvider($faker));
    $faker->addProvider(new GbCitiesProvider($faker));
    $faker->addProvider(new DeCitiesProvider($faker));
     
    return [
      'nickname' => $this->faker->firstName(),
      'mobile_number' => $this->faker->unique()->numerify($phonePrefix . '##########'),
      'country_code' => $phonePrefix,
      'email' => $this->faker->unique()->safeEmail(),
      'password' => Hash::make('Test@123'),
      'gender' => $this->faker->randomElement(['M', 'F']),
      'dob' => $this->faker->dateTimeBetween('1965-01-01', '2004-01-01')->format('Y-m-d'),
      'city' => $this->faker->city,
      'latitude' => $this->faker->latitude,
      'longitude' => $this->faker->longitude,
      'status' => 1,
      'device_type' => $this->faker->randomElement(['android', 'ios']),
      'created_by' => 1,
      'created_at' => now(),
    ];
  }
}

Thanks for your help.
0 likes
3 replies
jaseofspades88's avatar

You're missing the point of 'faker' if you want real cities. $this->faker->city gives you a city.

Please or to participate in this conversation.