如何使用LaravelSeeders和Eloquent模型使用示例数据填充数据库
Laravel 的 Seeders 是位于 Laravel 项目的 database/seeders
目录中的特殊类,允许您以编程方式在数据库中插入一组默认或示例记录。 演示应用程序有一个播种器类,它从应用程序文件夹根目录中的 links.yml
文件导入链接。
在您的代码编辑器中,打开以下文件:
database/seeders/LinkSeeder.php
它将包含以下代码:
数据库/播种机/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
模型,而是使用 查询生成器 在数据库中插入新链接。 这是在 Laravel 中处理数据库记录的另一种方式,它不依赖于 Eloquent 模型。 尽管这很好用,但通过使用 Eloquent 模型,您将可以访问一系列有用的方法和快捷方式,使您的代码更简洁、更易于阅读。
要改进此代码,您将更改 foreach
循环以使用 Eloquent 模型,而不是直接使用查询构建器查询数据库。 您还必须在循环开始之前创建一个默认链接列表(在以下代码中称为 $default_list
),以便您可以在创建的每个新链接中引用此列表。
用以下代码替换播种器类中的当前内容:
数据库/播种机/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); } } } }
更新后的代码使用面向对象的方法来设置 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 查询数据库记录。