Előfordulhat, hogy egy adatbázis táblát egy valamilyen meglévő szöveges állományból kell feltölteni.
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
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();
Majd a foreach ciklus bejárja az adathalmazt és a Drink model create() metódusával kiírja az adatot.