Сущности и миграции
С базой данных Symfony работает через Doctrine. Каждой таблице соответствует сущность — обычный класс PHP, а каждой строке — его объект. В отличие от моделей Laravel, сущность ничего не знает о базе: сохранением занимается отдельный объект.
Подключение
Адрес базы данных задают в файле .env:
DATABASE_URL="mysql://root:secret@127.0.0.1:3306/blog?serverVersion=8.0.32&charset=utf8mb4"Саму базу создаёт команда:
php bin/console doctrine:database:createСоздание сущности
php bin/console make:entity PostКоманда спросит о каждом поле: имя, тип, длину, может ли быть пустым. В результате появятся два файла — сущность и репозиторий.
Как выглядит сущность
// src/Entity/Post.php
namespace App\Entity;
use App\Repository\PostRepository;
use Doctrine\DBAL\Types\Types;
use Doctrine\ORM\Mapping as ORM;
#[ORM\Entity(repositoryClass: PostRepository::class)]
class Post
{
#[ORM\Id]
#[ORM\GeneratedValue]
#[ORM\Column]
private ?int $id = null;
#[ORM\Column(length: 255)]
private ?string $title = null;
#[ORM\Column(type: Types::TEXT)]
private ?string $body = null;
#[ORM\Column]
private bool $published = false;
public function getId(): ?int
{
return $this->id;
}
public function getTitle(): ?string
{
return $this->title;
}
public function setTitle(string $title): static
{
$this->title = $title;
return $this;
}
// остальные методы get и set
}Атрибуты #[ORM\Column] описывают столбцы. Свойства закрыты, доступ к ним — через методы.
Параметры столбца
| Запись | Значение |
|---|---|
#[ORM\Column(length: 100)] | Строка до 100 символов |
#[ORM\Column(nullable: true)] | Может быть пустым |
#[ORM\Column(unique: true)] | Значения не повторяются |
#[ORM\Column(type: Types::TEXT)] | Длинный текст |
#[ORM\Column(options: ['default' => 0])] | Значение по умолчанию |
Тип столбца Doctrine обычно определяет по типу свойства: int, string, bool, float, \DateTimeImmutable.
Миграция
Сущность — только описание. Таблицу создаёт миграция:
php bin/console make:migration
php bin/console doctrine:migrations:migrateПервая команда сравнивает сущности с базой и записывает разницу в файл в папке migrations. Вторая выполняет его.
Изменение структуры
Чтобы добавить поле, снова запустите make:entity Post и ответьте на вопросы — или допишите свойство вручную. Затем создайте и выполните новую миграцию. Так структура базы меняется шаг за шагом, и каждый шаг хранится в репозитории проекта.
Частая ошибка
Команда doctrine:schema:update --force меняет базу сразу, без файла миграции. На своём компьютере это удобно, но на сервере такие изменения нечем повторить и нечем отменить. Структуру рабочей базы меняйте только миграциями и перед выполнением читайте созданный файл: Doctrine может предложить удалить столбец вместе с данными.