Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Фабрики и сиды

Пустую базу неудобно разрабатывать: не видно, как выглядит список из ста статей или страница с длинным именем. Фабрики и сиды создают правдоподобные данные одной командой — и у вас, и у каждого участника команды.

Фабрика

Фабрика описывает, как выглядит одна запись модели. Создаётся командой:

php artisan make:factory PostFactory

В методе definition() задают значения столбцов. Функция fake() генерирует случайные, но похожие на настоящие данные:

namespace Database\Factories;
 
use Illuminate\Database\Eloquent\Factories\Factory;
 
class PostFactory extends Factory
{
    public function definition(): array
    {
        return [
            'title' => fake()->sentence(),
            'body' => fake()->paragraphs(3, true),
            'is_published' => fake()->boolean(80),
        ];
    }
}

Подключение к модели

Модель получает метод factory() через трейт HasFactory:

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
 
class Post extends Model
{
    use HasFactory;
}

Создание записей

$post = Post::factory()->create();
 
$posts = Post::factory()->count(20)->create();
 
$draft = Post::factory()->create(['is_published' => false]);

Массив в create() переопределяет значения из фабрики. Метод make() создаёт объект, но не сохраняет его в базу.

Связанные записи

Фабрика умеет создавать и связанные модели:

$user = User::factory()
    ->has(Post::factory()->count(3))
    ->create();

У пользователя появятся три статьи с правильным user_id.

Сид

Сид — класс, который наполняет базу. Главный сид лежит в database/seeders/DatabaseSeeder.php:

namespace Database\Seeders;
 
use App\Models\Post;
use App\Models\User;
use Illuminate\Database\Seeder;
 
class DatabaseSeeder extends Seeder
{
    public function run(): void
    {
        User::factory()->create([
            'name' => 'Admin',
            'email' => 'admin@example.com',
        ]);
 
        Post::factory()->count(50)->create();
    }
}

Запуск

php artisan db:seed
php artisan migrate:fresh --seed

Вторая команда удаляет все таблицы, выполняет миграции заново и сразу запускает сиды — так базу приводят в исходное состояние.

Частая ошибка

migrate:fresh стирает все данные. На рабочем сервере эту команду запускать нельзя: Laravel спросит подтверждение, но лучше не доводить до этого. Сиды со случайными данными — только для разработки и тестов.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.