如何使用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);
            }
        }
    }
}
 
 

更新后的代码使用面向对象的方法来设置 LinkListList 模型的属性,这些模型由 Eloquent 转换为表格列。 for 循环的最后一行使用 $default_listlinks 表的引用,该表通过方法 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 查询数据库记录。