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:
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.