LaravelSeedersとEloquentモデルを使用してデータベースにサンプルデータを入力する方法

提供:Dev Guides
移動先:案内検索

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を使用してデータベースレコードをクエリする方法について詳しく学習します。