Usar JSON y Laravel Seeder para alimentar la base de datos

A veces es útil cargar seeders desde JSON, ya que existen ciertos JSON que son útiles para tu proyecto de Laravel. Te mostrare un código sencillo que puedes usar JSON y Laravel Seeder para alimentar la base de datos

JSON y Laravel Seeder

Por ejemplo, yo encontré archivos JSON de los Estados y Ciudades de un determinado país, y como sigo en la etapa de desarrollo de la plataforma, requiero estar haciendo muchas pruebas con la información y los seeders de Laravel.

Es por eso que se me hizo útil compartir esta manera de hacerlo, aparte de que es muy sencilla.

Guardar archivos JSON

A mi me gusta manipular los JSON si en dado caso es requerido, por eso lo guardo localmente en el proyecto, después si es necesario en producción no subir esta carpeta.

Cree una carpeta llamada data en /database/data ahí guardaré todos mis JSON a crear con Laravel Seeder.

data-json-laravel-seeder alt <>

Yo guarde 2 archivos uno llamado city.json y otro state.json, aparte de tener la información, cuentan con una relación que necesito.

Este es el fragmento del JSON, que encontré en internet y lo guarde en mi proyecto Laravel:

name.json
[
    {
        "id": "1",
        "clave": "01",
        "nombre": "Aguascalientes"
    },
    {
        "id": "2",
        "clave": "02",
        "nombre": "Baja California"
    },
    {
        "id": "3",
        "clave": "03",
        "nombre": "Baja California Sur"
    },
    {
        "id": "4",
        "clave": "04",
        "nombre": "Campeche"
    },
    {
        "id": "5",
        "clave": "05",
        "nombre": "Coahuila de Zaragoza"
    }
]

Crear migración

Una ves con los archivos JSON estén en la ubicación deseada, puedes hacer la migración correspondiente de cada tabla (en mi caso yo usare dos tablas, una para Estados y otra para Ciudades).

Quedando de esta manera para la tabla “states”:

public function up()
{
    Schema::create('states', function (Blueprint $table) {
        $table->increments('id');
        $table->string('code');
        $table->string('name');
        $table->timestamps();
    });
}

Para la tabla “cities”:

public function up()
{
    Schema::create('cities', function (Blueprint $table) {
        $table->increments('id');
        $table->integer('state_id')->unsigned();

        $table->foreign('state_id')->references('id')->on('states')->onDelete('cascade');
        
        $table->string('code');
        $table->string('name');
        $table->timestamps();
    });
}

De esta manera puedo tener la relación con state_id.

Crear archivos Seeders

Iniciamos con el Seeder de “States”, cuando descargue el JSON estaba en español, así que tuve que hacer unas modificaciones.

public function run()
{
    DB::table('states')->delete();
    $json = File::get("database/data/state.json");
    $data = json_decode($json);
    foreach ($data as $obj) {
        State::create(array(
            'id' => $obj->id,
            'code' => $obj->clave,
            'name' => $obj->nombre,
        ));
    }
}

De igual manera con el Seeder de “Cities”.

public function run()
{
    DB::table('cities')->delete();
    $json = File::get("database/data/city.json");
    $data = json_decode($json);
    foreach ($data as $obj) {
        City::create(array(
        'id' => $obj->id,
        'state_id' => $obj->estado_id,
        'code' => $obj->clave,
        'name' => $obj->nombre,
    ));
    }
}

Una ves terminado, me quedo de esta manera las tablas.

Tabla “states”.

states-json-seed-laravel alt <>

Tabla “cities”.

cities-json-seed-laravel alt <>

Conclusión

Es un código muy simple pero que funciona cuando vas a Usar JSON y Laravel Seeder para alimentar la base de datos, es posible que tengas que exportar mucha información desde un JSON, pero bueno tan simple que es el código se tendría que modificar si se requiere para otro ejemplo que no sea similar a este.

Falta agregar las locaciones, que tienen una relación con la tabla “cities”.

También por otro lado espero crear un repositorio con estos JSON, para tener actualizada la información ya que siempre es bueno tener esto cuando se requiere.

Por último, ¿Por qué no use un paquete ya creado?, ta que solo requiero los estados y las ciudades importantes del México, los otros podrían cargar información innecesaria. Aún así hay muy buenas alternativas para esto.

Paquetes que puedes usar si no te funciona lo mencionado en este artículo: Laravel Geo World Cities