Laravel 10.x karkasas. Pradiniai duomenys (seeds)

Pradinių duomenų įrašymas į duomenų bazės lentelę

Kartais kitiems programuotojams perduoti reikia ne tik lentelių struktūras (migracijas), bet ir tam tikrus iš anksto į jas įrašytus duomenis. Tam yra naudojami seed'ai. Pavyzdžiui, sukurkime seed'ą categories lentelei. Tam komandinėje eilutėje įveskite tokią komandą:
php artisan make:seeder CategoriesSeeder
Naujai sukurtas seed'as CategoriesSeeder.php atsiras ../library/database/seeders/ kataloge. Atidarykite jį ir metode run() įrašykite sekančias eilutes:
public function run(): void
{
    $categories = [            
        ['title' => 'Romanas'],
        ['title' => 'Drama'],
        ['title' => 'Detektyvas'],
        ['title' => 'Fantastika'],
        ['title' => 'Eilėraščiai'],
        ['title' => 'Enciklopedija'],
        ['title' => 'Istorija'],
        ['title' => 'Žodynas'],
        ['title' => 'Sveikata'],
        ['title' => 'Kulinarija'],
        ['title' => 'Menas']
    ];
    foreach ($categories as $category) {
        DB::table('categories')->insert($category);
    }
}
Taip pat virš klasės CategoriesSeeder įrašykite kelią iki DB klasės:
use Illuminate\Support\Facades\DB;
Sukurkime dar vieną seed'ą users lentelei:
php artisan make:seeder UserSeeder
run() metode įrašykite:
public function run(): void
{
    DB::table('users')->insert([
        'name' => Str::random(10),
        'email' => Str::random(10).'@gmail.com',
        'password' => Hash::make('password'),
    ]);
}
O prie naudojamų klasių pridėkite šias:
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Str;
Tada atsidarykite failą ../library/database/seeders/DatabaseSeeder.php ir jo run() metode iškvieskite naujai sukurtas klases:
public function run(): void
{
    $this->call([
        CategoriesSeeder::class,
        UserSeeder::class
    ]);
}
Visos šioje vietoje iškviestos klasės suteiks galimybę įterpti į duomenų bazę nurodytus įrašus. Belieka sistemai nurodyti, kad ji tai atliktų:
php artisan db:seed
Norint įvykdyti seed'ą pasirinktai lentelei, komandinėje eilutėje įveskite šią komandą:
php artisan db:seed --class=CategoriesSeeder
Sukūrus ir įvykdžius CategoriesSeeder seed'ą lentelėje categories turėtų atsirasti tokie įrašai:
Seeds
Atitinkamai matysite naujus įrašus ir users lentelėje.

Duomenų nuskaitymas iš CSV failo ir įrašymas į duomenų bazės lentelę

Tarkim, į duomenų bazę reikia įrašyti didelį kiekį duomenų iš tam tikro failo formato, pvz., CSV. Kaip pavyzdį paimsime visų šalių sąrašą iš šio šaltinio. Išsaugokite jį kur nors savo kompiuteryje.
Sukurkime migraciją šiam failui:
php artisan make:migration create_countries_table --create=countries
Migracijos metodą up() pakeiskite į šį:
public function up(): void
{
    Schema::create('countries', function (Blueprint $table) {
        $table->id('id');
        $table->string('country', 2);
        $table->decimal('latitude', 10, 8)->nullable();
        $table->decimal('longitude', 11, 8)->nullable();
        $table->string('name');
        $table->timestamps();
    });
}
Taip pat sukurkime migraciją, kuri pridėtų šalies įrašą prie autoriaus:
php artisan make:migration add_country_id_field_to_authors_table --table=authors
Atsidarykite migraciją ir up() metode įrašykite tokį programinį kodą:
public function up(): void
{
    Schema::table('authors', function (Blueprint $table) {
        $table->foreignId('country_id')->after('gender');
        $table->foreign('country_id')->references('id')->on('countries');
    });
}
Įvykdykite migracijas:
php artisan migrate
Sukurkite seed'ą:
php artisan make:seeder CountriesSeeder
Jo metodą run() pakeiskite į šį:
public function run(): void
{
    //nurodykite pilną kelią iki dokumento
    if (($handle = fopen("C:/xampp/htdocs/library/database/countries.csv", "r")) !== FALSE) {
        fgetcsv($handle); // praleidžiama pirma eilutė su laukų pavadinimais
        while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
            DB::table('countries')->insert([
                'country' => $data[0],
                'latitude' => !empty($data[1]) ? $data[1] : NULL,
                'longitude' => !empty($data[2]) ? $data[2] : NULL,
                'name' => $data[3],
            ]);
        }
        fclose($handle);
    }
}
Taip pat virš klasės CountriesSeeder įrašykite kelią iki DB klasės:
use Illuminate\Support\Facades\DB;
PASTABA. Funkcijai fopen() reikia nurodyti failo kelią, jis gali skirtis priklausomai nuo to, kur saugosite failą su duomenimis.
Atsidarykite failą ../library/database/seeders/DatabaseSeeder.php ir jo metode run() įrašykite:
public function run(): void
{
    $this->call([
        CategoriesSeeder::class,
        UserSeeder::class,
        CountriesSeeder::class
    ]);
}
Tada komandinėje eilutėje įveskite komandą, kuri įterps įrašus iš CSV failo į duomenų bazę:
php artisan db:seed --class=CountriesSeeder
Daugiau apie seed'us skaitykite oficialioje Laravel 10.x dokumentacijoje, skiltyje Database: Seeding.

Paskutinį kartą puslapis keistas 2023-05-10

© Joana Katina 2016-2024. Visos teisės saugomos