Skip to content

Глава 2.2: Создание модели Planet

Время изучения: 45 минут


1. Модель в Laravel: Чертеж космического объекта

В MVC-архитектуре (Model-View-Controller) модель — это:

  • 📦 Контейнер для данных (параметры планет)
  • 🔌 Интерфейс работы с базой данных
  • 🛡️ Центр бизнес-логики приложения

💡 Космическая аналогия: Модель Planet = Чертеж планеты в компьютере ЦУП. По нему можно:

  • Создать новую планету в каталоге (INSERT)
  • Получить данные о Марсе (SELECT)
  • Обновить сведения об атмосфере (UPDATE)

2. Создание модели и миграции

Laravel использует Artisan CLI — ваш "пульт управления" проектом.

Шаг 1: Генерация модели с миграцией

php artisan make:model Planet -m

Что создалось:

app/
  └── Models/
      └── Planet.php    ← Модель
database/
  └── migrations/
      └── 2025_08_04_000000_create_planets_table.php  ← Миграция

Флаги Artisan:

  • -m → Создать миграцию
  • -c → Создать контроллер
  • -r → Ресурсный контроллер

💡 Профессиональный совет: Эти флаги можно комбинировать для максимальной эффективности. Команда php artisan make:model Planet -mcr создаст сразу модель, миграцию и ресурсный контроллер для управления этой моделью. Это экономит много времени.


3. Настройка модели Planet

Откройте app/Models/Planet.php:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Planet extends Model
{
    // Название таблицы (по умолчанию: 'planets')
    // Laravel автоматически предполагает, что имя таблицы — это множественная форма имени модели в snake_case (Planet -> planets).
     //Поэтому это свойство здесь не обязательно, но полезно для наглядности.
    protected $table = 'planets';

    // Разрешенные для заполнения поля
    protected $fillable = [
        'name',
        'description',
        'size_km',
        'solar_system',
        'image_url'
    ];

    // Типы данных для автоматического преобразования
    protected $casts = [
        'size_km' => 'integer'
    ];
}

Пояснение свойств:

Свойство Значение Пример данных
$table Имя таблицы в БД planets
$fillable Поля для массового заполнения name, size_km
$casts Автоматическое преобразование типов size_km: integer

4. Дизайн таблицы планет

Перед редактированием миграции определим структуру "планеты":

Поле Тип данных Описание Пример значения
id BIGINT (PK) Уникальный ID 1
name VARCHAR(255) Название планеты "Марс"
description TEXT Описание "Красная планета..."
size_km INTEGER Диаметр в км 6779
solar_system VARCHAR(100) Солнечная система "Солнечная система"
image_url VARCHAR(2048) URL фото (может быть null) "https://..."
created_at TIMESTAMP Дата создания 2025-08-04 12:00:00
updated_at TIMESTAMP Дата обновления 2025-08-05 09:30:00

5. Редактирование миграции

Откройте файл миграции в database/migrations/..._create_planets_table.php:

<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreatePlanetsTable extends Migration
{
    public function up()
    {
        Schema::create('planets', function (Blueprint $table) {
            $table->id(); // BIGINT автоинкремент

            $table->string('name')->unique();
            $table->text('description');
            $table->integer('size_km');
            $table->string('solar_system', 100);
            $table->string('image_url', 2048)->nullable();

            $table->timestamps(); // created_at + updated_at
        });
    }

    public function down()
    {
        Schema::dropIfExists('planets');
    }
}

Ключевые моменты:

  • ->unique() → Гарантирует уникальность названий
  • ->nullable() → Поле может быть пустым
  • timestamps() → Автоматическое управление датами

6. Запуск миграции (предварительный)

Хотя запуск будет в главе 2.3, посмотрим как это будет выглядеть:

php artisan migrate

Ожидаемый вывод:

Migrating: 2025_08_04_000000_create_planets_table
Migrated:  2025_08_04_000000_create_planets_table (32.15ms)

Проверка в pgAdmin 4:

  1. Откройте базу space_api → Schemas → Tables
  2. Должна появиться таблица planets с вашими полями

7. Альтернативный подход: Генераторы кода

Для ускорения разработки можно использовать пакеты:

  • Laravel Blueprint - создает модели/миграции по YAML-описанию
  • InfyOm Laravel Generator - генератор по схеме БД

Пример Blueprint:

models:
  Planet:
    name: string:255
    description: text
    size_km: integer
    solar_system: string:100
    image_url: string:2048? # Знак '?' означает, что поле nullable


Квиз для закрепления

1. Artisan-команда для создания модели и связанной с ней миграции:

2. Свойство `$fillable` в модели нужно для

3. nullable() в миграции означает:

4. Тип поля для длинного описания планеты:

5. Метод `timestamps()` создает:


🚀 Итог главы: Вы создали "цифровой двойник" планеты! Теперь в вашем проекте есть:

  • 🪐 Модель Planet с бизнес-логикой
  • 📊 Миграция для таблицы planets в PostgreSQL
  • 🛠️ Настроенные свойства модели (fillable, casts)

Готовьте базу данных! В следующей главе мы запустим миграцию и наполним вселенную первыми планетами.

📌 Проверка:

Убедитесь, что файлы Planet.php и ..._create_planets_table.php созданы в правильных директориях.

⚠️ Если Artisan ругается:

  • Проверьте, что находитесь в папке проекта
  • Убедитесь, что установлены зависимости (composer install)
  • Для Windows: добавьте PHP и Composer в PATH