Документация Laravel 10.x
Здесь ты найдешь сниппеты по Laravel и полезные советы по веб-разработке.
Laravel предоставляет возможность наполнения базы данных данными с использованием классов сидеров. Все классы сидеров хранятся в каталоге database/seeders
. По умолчанию для вас определен класс DatabaseSeeder
. Из этого класса вы можете использовать метод call
для запуска других классов сидеров, что позволяет вам контролировать порядок выполнения сидеров.
Примечание Защита от массового присвоения автоматически отключается во время наполнения базы данных.
Чтобы создать сидер, выполните команду Artisan make:seeder
. Все сидеры, созданные фреймворком, будут помещены в каталог database/seeders
:
php artisan make:seeder UserSeeder
Класс сидера по умолчанию содержит только один метод: run
. Этот метод вызывается при выполнении команды Artisan db:seed
. Внутри метода run
вы можете вставлять данные в базу данных любым удобным для вас способом. Вы можете использовать строитель запросов, чтобы вручную вставлять данные, или фабрики моделей Eloquent.
В качестве примера давайте модифицируем класс DatabaseSeeder
по умолчанию и добавим оператор вставки данных в метод run
:
<?php namespace Database\Seeders; use Illuminate\Database\Seeder;use Illuminate\Support\Facades\DB;use Illuminate\Support\Facades\Hash;use Illuminate\Support\Str; class DatabaseSeeder extends Seeder{ /** * Запустите сидеры базы данных. */ public function run(): void { DB::table('users')->insert([ 'name' => Str::random(10), 'email' => Str::random(10).'@gmail.com', 'password' => Hash::make('password'), ]); }}
Примечание Вы можете указать зависимости, которые вам нужны, в сигнатуре метода
run
. Они будут автоматически разрешены через сервис-контейнер Laravel.
Конечно же, вручную указывать атрибуты для каждого сида модели неудобно. Вместо этого вы можете использовать фабрики моделей, чтобы удобно генерировать большое количество записей в базе данных. Сначала ознакомьтесь с документацией по фабрикам моделей, чтобы узнать, как определить свои фабрики.
Например, давайте создадим 50 пользователей, у каждого из которых есть один связанный пост:
use App\Models\User; /** * Запустите сидеры базы данных. */public function run(): void{ User::factory() ->count(50) ->hasPosts(1) ->create();}
В классе DatabaseSeeder
вы можете использовать метод call
для выполнения дополнительных классов сидеров. Использование метода call
позволяет разбить наполнение базы данных на несколько файлов, чтобы ни один класс сидера не становился слишком большим. Метод call
принимает массив классов сидеров, которые должны быть выполнены:
/** * Запустите сидеры базы данных. */public function run(): void{ $this->call([ UserSeeder::class, PostSeeder::class, CommentSeeder::class, ]);}
При выполнении сидеров вы можете захотеть предотвратить отправку событий моделями. Это можно достичь с использованием трейта WithoutModelEvents
. Когда он используется, трейт WithoutModelEvents
гарантирует, что никакие события модели не будут отправлены, даже если дополнительные классы сидеров выполняются с использованием метода call
:
<?php namespace Database\Seeders; use Illuminate\Database\Seeder;use Illuminate\Database\Console\Seeds\WithoutModelEvents; class DatabaseSeeder extends Seeder{ use WithoutModelEvents; /** * Запустите сидеры базы данных. */ public function run(): void { $this->call([ UserSeeder::class, ]); }}
Для наполнения базы данных вы можете использовать команду Artisan db:seed
. По умолчанию эта команда выполняет класс Database\Seeders\DatabaseSeeder
, который, в свою очередь, может вызывать другие классы сидеров. Однако вы можете использовать опцию --class
, чтобы указать конкретный класс сидера для выполнения по отдельности:
php artisan db:seed php artisan db:seed --class=UserSeeder
Также вы можете использовать команду migrate:fresh
в сочетании с опцией --seed
для наполнения базы данных, которая удалит все таблицы и повторно выполнит все миграции. Эта команда полезна для полной перестройки вашей базы данных. Опцию --seeder
можно использовать для указания конкретного сидера для выполнения:
php artisan migrate:fresh --seed php artisan migrate:fresh --seed --seeder=UserSeeder
Некоторые операции наполнения могут привести к изменению или потере данных. Чтобы защитить вас от случайного выполнения команд наполнения на производственной базе данных, перед выполнением сидеров в среде production
вас попросят подтверждение. Чтобы принудительно выполнить сидеры без запроса подтверждения, используйте флаг --force
:
php artisan db:seed --force