Заполнение таблицы Laravel с помощью сидеров

Eloquent – это объектно-реляционный преобразователь (ORM), который включен в структуру Laravel по умолчанию. В этой серии статей вы узнаете, как делать запросы к базе данных и как работать с отношениями в Laravel Eloquent. Также вы сможете попрактиковаться на примерах: мы попробуем улучшить демо-приложение с помощью новых моделей и отношений.

Примечание: Все мануалы данной серии можно найти по тегу Laravel Eloquent.

Сидеры Laravel – это специальные классы, которые находятся в каталоге database/seeders проекта Laravel, которые предоставляют программный способ вставки наборов стандартных или выборочных записей в БД. В нашем демо-приложении есть класс для сидера, который импортирует ссылки из файла links.yml в корневой каталог приложения.

Читайте также: Настройка абстрактной базы данных в Laravel с помощью миграций и сидеров

В редакторе кода откройте следующий файл:

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, вместо этого для вставки новых ссылок в БД он использует конструктор запросов. Это еще один способ работы с записями БД в Laravel, который не зависит от моделей Eloquent. Он работает хорошо, однако модели 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

Теперь, чтобы восстановить таблицы и запустить обновленные сидеры, вы можете использовать следующую команду:

docker-compose exec app php artisan migrate --seed

Вы должны получить примерно такой вывод:

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.

В следующем мануале этой серии мы подробнее рассмотрим, как запрашивать записи из БД с помощью Eloquent.

Tags: , ,

Добавить комментарий