Encodera

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

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

Оглавление

Сущности и миграции

С базой данных 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 может предложить удалить столбец вместе с данными.

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

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