Table of Contents
Laravel’s Seeders are special classes that live in the database/seeders directory in a Laravel project that allow you to programmatically insert a collection of default or sample records in the database. The demo application has a seeder class that imports links from a links.yml file in the root of the application folder.
In your code editor, open the following file:
database/seeders/LinkSeeder.php
It will contain the following code:
[label 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']
]);
}
}
}
}
Notice that this code does not use the Link model and instead uses the query builder to insert new links in the database. This is a different way of working with database records in Laravel that doesn’t depend on Eloquent models. Even though this works well, by using Eloquent models you’ll have access to a series of helpful methods and shortcuts to make your code more concise and easier to read.
To improve this code, you’ll change the foreach loop to use Eloquent models instead of querying the database directly with the query builder. You’ll also have to create a default list of links (called $default_list in the following code) before the loop is started, so that you can reference this list in each new link created.
Replace the current content in your seeder class with the following code:
[label 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);<^>
}
}
}
}
The updated code uses an object-oriented approach for setting up the properties for the LinkList and List models that are translated into table columns by Eloquent. The final line of the for loop uses the $default_list reference to the links table, which is accessed via the method links(), to save new links within that list.
Save the file when you’re done. Laravel seeders will only run when the database is empty, so as to not conflict with actual data that was inserted in the database by other means. Thus in order to run the modified seeder, you’ll need to wipe the database once again with the artisan db:wipe command..
Run the following command to wipe the development database:
docker-compose exec app php artisan db:wipe
[secondary_label Output]
Dropped all tables successfully.
Now to recreate the tables and run the updated seeders, you can use the following artisan migrate --seed command:
docker-compose exec app php artisan migrate --seed
You should receive output that is similar to the following:
[secondary_label Output]
Migration 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.<^>
In the next chapter of this series, you’ll learn in more detail how to query database records with Eloquent.