LaravelSeedersとEloquentモデルを使用してデータベースにサンプルデータを入力する方法
LaravelのSeedersは、 database/seeders
Laravelプロジェクトのディレクトリ。データベースにデフォルトまたはサンプルレコードのコレクションをプログラムで挿入できます。 デモアプリケーションには、からリンクをインポートするシーダークラスがあります。 links.yml
アプリケーションフォルダのルートにあるファイル。
コードエディタで、次のファイルを開きます。
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
モデルを作成し、代わりにクエリビルダーを使用してデータベースに新しいリンクを挿入します。 これは、Eloquentモデルに依存しないLaravelのデータベースレコードを操作する別の方法です。 これはうまく機能しますが、Eloquentモデルを使用すると、一連の便利なメソッドとショートカットにアクセスして、コードをより簡潔で読みやすくすることができます。
このコードを改善するには、 foreach
クエリビルダーでデータベースに直接クエリを実行する代わりに、Eloquentモデルを使用するようにループします。 また、リンクのデフォルトリストを作成する必要があります( $default_list
次のコードで)ループが開始される前に、作成された新しいリンクごとにこのリストを参照できるようにします。
シーダークラスの現在のコンテンツを次のコードに置き換えます。
<?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);
}
}
}
}
更新されたコードは、オブジェクト指向のアプローチを使用して、 LinkList
と List
Eloquentによってテーブル列に変換されるモデル。 forループの最後の行は $default_list
メソッドを介してアクセスされるlinksテーブルへの参照 links()
、そのリスト内に新しいリンクを保存します。
完了したらファイルを保存します。 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を使用してデータベースレコードをクエリする方法について詳しく学習します。