Esto es algo bastante común, para la carga inicial de datos, alguien nos pasa un Excel o un archivo .csv ¿cómo se carga una tabla de la base de datos con Laravel a partir de estos archivos?

Un archivo .csv se carga con la función fgetcsv() de PHP, a la cual se le pasa un handler de archivo, creado con fopen(), no es tán dificil, esto normalmente tomaría la siguiente forma:

$f = fopen('/ruta/archivo.csv', 'r')
while (($data = fgetcsv($f)) !== false) {
    //
    // procesamiento
    //
}

En realidad el truco más importante es ¿y dónde se guarda el archivo .csv?, pues encontré que el mejor lugar es bajo el directorio public de nuestra aplicación, quizás bajo public/csv y después usar la función public_path(). Así que el código quedaría como sigue:

$f = fopen(public_path('csv/archivo.csv'), 'r')
while (($data = fgetcsv($f)) !== false) {
    //
    // procesamiento
    //
}

Ahora, la parte del procesamiento. $data va a recibir un arreglo por cada renglón del archivo .csv. En mi caso, tenía un archivo de empleados que se veía de la siguiente forma:

NumeroEmpleado Nombre CorreoElectronico ...
11111 Antonio antonio@gmail.com ...
22222 Beatriz beatriz@gmail.com ...
33333 Carlos carlos@gmail.com ...
... ... ... ...

Lo que tenemos que hacer, simplemente es añadir el renglón al modelo User, por lo que nuestro código terminaría siendo el siguiente:

$f = fopen(public_path('csv/archivo.csv'), 'r')
while (($data = fgetcsv($f)) !== false) {
    if ($data[0] != 'NumeroEmpleado') {
        App\User::create([
            'email'           => $data[2],
            'numero_empleado' => $data[0],
            'name'            => $data[1],
            'password'        => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi',
        ]);
    }
}

La condición es necesaria, porque en mi caso, el archivo .csv traía encabezados, y hay que saltárselos. Hay muchas formas de hacerlo, quizás lo más correcto era contar el número de registros y saltarse uno. Pero bueno, para mi funcionó así.

El hash que se mete a password es el que corresponde a la palabra "password" y me lo "robé" de un factory para usuarios. Es necesario asignarlo, ya que es un campo requerido en la base de datos.

Finalmente, éste código lo metí dentro de un Seeder, en mi caso uno que cree llamado UsersSeeder, de esta forma, cuando inicializo la base de datos en mi aplicación con php artisan migrate:fresh --seed, se cargan los datos del .csv a la tabla Users de la base de datos. Puedes utilizar este mismo método para cargar otras tablas, como pueden ser departamentos, productos, y otros tantos catálogos cuya información es principalmente estática.