< Laravel

Laravel fájlkezelés

Szerző: Rékási József

Copyright © 2025, Rékási József

Licenc: CC Attribution-Share Alike 4.0 International

Web: https://szit.hu

Adatbázis tábla feltöltése szöveges állományból

Előfordulhat, hogy egy adatbázis táblát egy valamilyen meglévő szöveges állományból kell feltölteni.

SQL állomány

Példa sql állomány drink.sql

INSERT INTO types (TYPE) VALUES ('Sör'), ('Bor'), ('Pálinka'), ('Üdítőital'), ('Energiaital'), ('Koktél'), ('Tea'), ('Kávé'), ('Smoothie'); INSERT INTO packages (package) VALUES ('0.33l palack'), ('0.5l palack'), ('1l palack'), ('2l palack'), ('330ml doboz'), ('500ml doboz'), ('4db-os csomag'), ('6db-os csomag'), ('1l üveg'), ('2l üveg'); INSERT INTO drinks (drink, amount, type_id, package_id) VALUES ('Heineken', 10, 1, 1), ('Budweiser', 15, 1, 1), ('Chardonnay', 12, 2, 3), ('Cabernet Sauvignon', 5, 2, 3), ('Szilvapálinka', 8, 3, 2), ('Apple Juice', 20, 4, 1), ('Coca-Cola', 30, 4, 1), ('Monster', 12, 5, 1), ('Mojito', 6, 6, 1), ('Green Tea', 25, 7, 1);

Az adatbázisnak és a tábláknak létezniük kell, futtasuk először a migrációs állományokat. A fájlt helyezzük el a /database/seeders könyvtárban. A Laravel alapértelmezetten itt fogja keresni a fájlt, ha máshol szeretnénk elhelyezni természetesen van rá lehetőség, de akkor definiálni kell az elérési útvonalat. Készítsünk seeder állományt:

php artisan make:seeder DrinkSeeder

A /database/seeders könyvtárban létrejön a seeder, ez fogja feltölteni az adattáblákat. Emeljük be a seederbe a működéshez szükséges osztályt.

use Illuminate\Support\Facades\DB;

A seeder run() metódusát töltsük fel az alábbi kóddal:

public function run(): void { $sql = file_get_contents( __DIR__ . "/drink.sql" ); DB::unprepared( $sql ); }

Ez beolvassa az sql kiterjesztésű fájlt és az ott található utasításokat lefuttatja. Ha a táblákat egyesével szeretnénk feltölteni abban az esetben több sql állományra van szükség és külön seedereket kell készíteni hozzájuk. Ezeket összefogva a DatabaseSeeder osztályban tudjuk futtatni. Futtasuk le a DrinkSeedert.

php artisan db:seed --class=DrinkSeeder

CSV állomány

Példa CSV állomány drink.csv

id:drink:amount:type_id:package_id
1:Heineken:10:1:1
2:Budweiser:15:1:1
3:Chardonnay:12:2:3
4:Cabernet Sauvignon:5:2:3
5:Szilvapálinka:8:3:2
6:Apple Juice:20:4:1
7:Coca-Cola:30:4:1
8:Monster:12:5:1
9:Mojito:6:6:1
10:Green Tea:25:7:1

Készítsük el a seedert.

php artisan make:seeder DrinkSeeder

A csv fájlok beolvasásához szükség van egy külső csomagra ami alapértelmezetten nem része a Laravel projektnek. Ezt telepíteni kell a composer segítségével.

composer require league/csv

Ennek a csomagnak a Reader osztályát és a Storage osztályt be is kell emelni a seederbe. Ezen kívül még szükséges az adattábla modellje is, a feltöltés modellen keresztül fog megtörténni.

use League\Csv\Reader; use App\Models\Drink; use Illuminate\Support\Facades\Storage;

A Strorage osztályra azért van szükség mert a Laravel alapértelmezetten ezen az útvonalon keresi a csv kiterjesztésű fájlt:

/storage/app/private/public/

Természetesen máshol is el lehet helyezni a fájlt, de akkor definiálni kell az elérési útvonalat. A seeder run() metódusában helyezzük el az alábbi kódot:

public function run(): void { $csv = Reader::createFromPath( Storage::path( "public/drink.csv" ), "r" ); $csv->setHeaderOffset( 0 ); $records = $csv->getRecords(); foreach( $records as $record ) { Drink::create([ "id" => $record[ "id" ], "drink" => $record[ "drink" ], "amount" => $record[ "amount" ], "type_id" => $record[ "type_id" ], "package_id" => $record[ "package_id" ] ]); } }

Ez a sor beolvassa a fájlt a megadott útvonalról:

$csv = Reader::createFromPath( Storage::path( "public/drink.csv" ), "r" );

A következő sorban kell megadni a tábla fejlécét, ha az állomány tartalmazza. Ez indexelve van, tehát, ha az első sor a fejléc abban az esetben az értéke: 0.

$csv->setHeaderOffset( 0 );

Ez a sor kiolvassa a sorokat a fájlból:

$records = $csv->getRecords();