LaravelSeedersとEloquentモデルを使用してデータベースにサンプルデータを入力する方法
LaravelのSeedersは、Laravelプロジェクトのdatabase/seeders
ディレクトリにある特別なクラスであり、データベースにデフォルトまたはサンプルレコードのコレクションをプログラムで挿入できます。 デモアプリケーションには、アプリケーションフォルダーのルートにあるlinks.yml
ファイルからリンクをインポートするシーダークラスがあります。
コードエディタで、次のファイルを開きます。
database/seeders/LinkSeeder.php
次のコードが含まれます。
database / seeders / LinkSeeder.php
<?php namespace Database\Seeders; use App\Models\Link; use Illuminate\Database\Seeder; use Illuminate\Support\Facades\DB; use Symfony\Component\Yaml\Yaml; class LinkSeeder extends Seeder { /** * Run the database seeds. * * @return void */ public function run() { //only import seeds if DB is empty. if (!Link::count()) { $this->importLinks(); } } /** * Imports Links from the default links.yml file at the root of the app. * Change that file to import a set of personal basic links you want to show * as soon as the application is deployed. */ public function importLinks() { $links_import_path = __DIR__ . '/../../links.yml'; $yaml = new Yaml(); if (is_file($links_import_path)) { $links = $yaml->parsefile($links_import_path); foreach ($links as $link) { DB::table('links')->insert([ 'url' => $link['url'], 'description' => $link['description'] ]); } } } }
このコードはLink
モデルを使用せず、代わりに querybuilderを使用してデータベースに新しいリンクを挿入することに注意してください。 これは、Eloquentモデルに依存しないLaravelのデータベースレコードを操作する別の方法です。 これはうまく機能しますが、Eloquentモデルを使用すると、一連の便利なメソッドとショートカットにアクセスして、コードをより簡潔で読みやすくすることができます。
このコードを改善するには、foreach
ループを変更して、クエリビルダーでデータベースに直接クエリを実行する代わりに、Eloquentモデルを使用します。 また、ループを開始する前に、リンクのデフォルトリスト(次のコードでは$default_list
と呼びます)を作成する必要があります。これにより、作成された新しいリンクごとにこのリストを参照できます。
シーダークラスの現在のコンテンツを次のコードに置き換えます。
database / seeders / LinkSeeder.php
<?php namespace Database\Seeders; use App\Models\Link; use App\Models\LinkList; use Illuminate\Database\Seeder; use Illuminate\Support\Facades\DB; use Symfony\Component\Yaml\Yaml; class LinkSeeder extends Seeder { /** * Run the database seeds. * * @return void */ public function run() { //only import seeds if DB is empty. if (!Link::count()) { $this->importLinks(); } } /** * Imports Links from the default links.yml file at the root of the app. * Change that file to import a set of personal basic links you want to show * as soon as the application is deployed. */ public function importLinks() { $links_import_path = __DIR__ . '/../../links.yml'; $yaml = new Yaml(); if (is_file($links_import_path)) { $links = $yaml->parsefile($links_import_path); $default_list = new LinkList(); $default_list->title = "Default"; $default_list->description = "Default List"; $default_list->slug = "default"; $default_list->save(); foreach ($links as $link) { $seed_link = new Link(); $seed_link->url = $link['url']; $seed_link->description = $link['description']; $default_list->links()->save($seed_link); } } } }
更新されたコードは、オブジェクト指向のアプローチを使用して、Eloquentによってテーブル列に変換されるLinkList
およびList
モデルのプロパティを設定します。 forループの最後の行は、メソッドlinks()
を介してアクセスされるlinksテーブルへの$default_list
参照を使用して、そのリスト内に新しいリンクを保存します。
完了したらファイルを保存します。 Laravelシーダーは、他の方法でデータベースに挿入された実際のデータと競合しないように、データベースが空の場合にのみ実行されます。 したがって、変更されたシーダーを実行するには、artisan db:wipe
コマンドを使用してデータベースをもう一度ワイプする必要があります…
次のコマンドを実行して、開発データベースをワイプします。
docker-compose exec app php artisan db:wipe
OutputDropped all tables successfully.
ここで、テーブルを再作成して更新されたシーダーを実行するには、次のartisan migrate --seed
コマンドを使用できます。
docker-compose exec app php artisan migrate --seed
次のような出力を受け取るはずです。
OutputMigration table created successfully. Migrating: 2014_10_12_000000_create_users_table Migrated: 2014_10_12_000000_create_users_table (124.20ms) Migrating: 2014_10_12_100000_create_password_resets_table Migrated: 2014_10_12_100000_create_password_resets_table (121.75ms) Migrating: 2019_08_19_000000_create_failed_jobs_table Migrated: 2019_08_19_000000_create_failed_jobs_table (112.43ms) Migrating: 2020_11_18_165241_create_links_table Migrated: 2020_11_18_165241_create_links_table (61.04ms) Migrating: 2021_07_09_122027_create_link_lists_table Migrated: 2021_07_09_122027_create_link_lists_table (112.18ms) Seeding: Database\Seeders\LinkSeeder Seeded: Database\Seeders\LinkSeeder (84.57ms) Database seeding completed successfully.
このシリーズの次の章では、Eloquentを使用してデータベースレコードをクエリする方法について詳しく学習します。