Laravel - Import Existing Records

Some records may have existed prior to the project creation. This tutorial demonstrates the steps to import the records and build a page to access them.

[0] Prep

Continue from previous article or download quickstart file.

[1] Migration Tasks

[1.1] Create migration file

php artisan make:migration create_members_table --create=members

Output:

[1.2] Edit migration file

Assuming we have the following DDL:

CREATE TABLE "members" (
"id" INTEGER,
"phid" VARCHAR,
"hid" VARCHAR,
"name" VARCHAR,
"email" VARCHAR NOT NULL,
"phone" VARCHAR,
"admn" INTEGER,
"mngr" INTEGER,
"cord" INTEGER,
"modr" INTEGER,
"oper" INTEGER,
PRIMARY KEY("id" AUTOINCREMENT)
)

Edit migration file as follows:

File C:\laragon\www\razzi\database\migrations\2024_03_31_062201_create_members_table.php:

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    /**
     * Run the migrations.
     */
    public function up()
    {
        Schema::create('members', function (Blueprint $table) {
            $table->id();
            $table->string('phid')->nullable();
            $table->string('hid')->nullable();
            $table->string('name')->nullable();
            $table->string('email')->nullable(false);
            $table->string('phone')->nullable();
            $table->integer('admn')->nullable();
            $table->integer('mngr')->nullable();
            $table->integer('cord')->nullable();
            $table->integer('modr')->nullable();
            $table->integer('oper')->nullable();
            $table->timestamps();
        });
    }

    /**
     * Reverse the migration.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('members');
    }
};

[1.2] Create model

php artisan make:model Member

Output:

Edit

File C:\laragon\www\razzi\app\Models\Member.php:

 <?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Member extends Model
{
    use HasFactory;

    /* specify table name (optional). */
    protected $table = 'members';

    /* specify fillabel fields. */
    protected $fillable = [
        'phid',
        'hid',
        'name',
        'email',
        'phone',
        'admn',
        'mngr',
        'cord',
        'modr',
        'oper',
    ];

}

[1.3] Run migration

php artisan migrate

Output:

[2] Import CSV data

Generate a new command using the Artisan command:

php artisan make:command ImportCsvData

Output:

Edit the import command:

File C:\laragon\www\razzi\app\Console\Commands\ImportCsvData.php :

<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use Illuminate\Support\Facades\DB;

class ImportCsvData extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'app:import-csv-data {file} {--table=members}';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Import csv data';

    /**
     * Execute the console command.
     */
    public function handle()
    {
        $file = $this->argument('file');
        $table = $this->option('table');

        if (!file_exists($file)) {
            $this->error('The specified file does not exist.');
            return 1;
        }

        $data = array_map('str_getcsv', file($file));
        $headers = array_shift($data);

        DB::table($table)->insert($this->combineHeadersAndData($headers, $data));

        $this->info($table . ' imported successfully.');
        return 0;
    }

    /**
     * Combine headers and data into associative arrays.
     *
     * @param array $headers
     * @param array $data
     * @return array
     */
    private function combineHeadersAndData(array $headers, array $data)
    {
        $combinedData = [];

        foreach ($data as $row) {
            $combinedData[] = array_combine($headers, $row);
        }

        return $combinedData;
    }
}

Run console command:

php artisan app:import-csv-data C:\laragon\z\razzi\members.csv --table=members

Output:

Check via Tinker commands:

php artisan tinker

App\Models\Member::count();

exit

Output:

Check via HeidiSQL (bundled in Laragon):

Download example:

https://archive.org/download/laravelprojects/razzi_20240331_laravel10_import_csv.zip