Глава 2.2: Создание модели Planet
Время изучения: 45 минут
1. Модель в Laravel: Чертеж космического объекта
В MVC-архитектуре (Model-View-Controller) модель — это:
- 📦 Контейнер для данных (параметры планет)
- 🔌 Интерфейс работы с базой данных
- 🛡️ Центр бизнес-логики приложения
💡 Космическая аналогия: Модель
Planet
= Чертеж планеты в компьютере ЦУП. По нему можно:
- Создать новую планету в каталоге (
INSERT
)- Получить данные о Марсе (
SELECT
)- Обновить сведения об атмосфере (
UPDATE
)
2. Создание модели и миграции
Laravel использует Artisan CLI — ваш "пульт управления" проектом.
Шаг 1: Генерация модели с миграцией
Что создалось:
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, посмотрим как это будет выглядеть:
Ожидаемый вывод:
Migrating: 2025_08_04_000000_create_planets_table
Migrated: 2025_08_04_000000_create_planets_table (32.15ms)
Проверка в pgAdmin 4:
- Откройте базу
space_api
→ Schemas → Tables - Должна появиться таблица
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
Квиз для закрепления
🚀 Итог главы: Вы создали "цифровой двойник" планеты! Теперь в вашем проекте есть:
- 🪐 Модель
Planet
с бизнес-логикой - 📊 Миграция для таблицы
planets
в PostgreSQL - 🛠️ Настроенные свойства модели (
fillable
,casts
)
Готовьте базу данных! В следующей главе мы запустим миграцию и наполним вселенную первыми планетами.
📌 Проверка:
Убедитесь, что файлы
Planet.php
и..._create_planets_table.php
созданы в правильных директориях.⚠️ Если Artisan ругается:
- Проверьте, что находитесь в папке проекта
- Убедитесь, что установлены зависимости (
composer install
)- Для Windows: добавьте PHP и Composer в PATH