Задать вопрос

Как добавить ключ в Symfony/Doctrine (миграция)?

Учебный пример.
В папке Entity у меня есть файлы Category.php и Video.php.
В БД есть одноименные таблицы.

category
id
title

video
id
title
category_id
youtube_id

У одной категории может быть много видео.
Мне нужно создать ключ, объединяющий поля category.id и video.category_id

Пишу в классе ManyToOne
Entity\Video.php
<?php
namespace App\Entity;
use App\Repository\VideoRepository;
use Doctrine\ORM\Mapping as ORM;

#[ORM\Entity(repositoryClass: VideoRepository::class)]
class Video
{
    #[ORM\Id]
    #[ORM\GeneratedValue]
    #[ORM\Column]
    private ?int $id = null;

    #[ORM\Column(length: 255)]
    private ?string $title = null;

    #[ORM\Column]
    private ?int $category_id = null;

    #[ORM\Column(length: 255)]
    private ?string $youtube_id = null;

    // У одной категории может быть много видео.
    #[ORM\ManyToOne(targetEntity: Category::class)]
    #[ORM\JoinColumn(name: 'category_id', referencedColumnName: 'id')]


Далее в командной строке
php bin/console make:entity --regenerate

 no change: src/Entity/Category.php
 no change: src/Entity/Page.php
 no change: src/Entity/Video.php
Success!

 php bin/console make:migration
[WARNING] You have 1 available migrations to execute.
Are you sure you wish to continue? (yes/no) [yes]:
y
 [WARNING] No database changes were detected.
 The database schema and the application mapping information are already in sync.

php bin/console doctrine:migrations:migrate
WARNING! You are about to execute a migration in database "fv" that could result in schema changes and data loss. Are you sure you wish to continue? (yes/no) [yes]:
 > y

[error] Migration DoctrineMigrations\Version20230104073939 failed during Execution. Error: "An exception occurred while executing a query: SQLSTATE[42S01]: Base table or view already exists: 1050 Table 'category' already exists"
In ExceptionConverter.php line 45:

  An exception occurred while executing a query: SQLSTATE[42S01]: Base table or view already exists: 1050 Table 'category' already exists


In Exception.php line 28:

  SQLSTATE[42S01]: Base table or view already exists: 1050 Table 'category' already exists


In Connection.php line 69:

  SQLSTATE[42S01]: Base table or view already exists: 1050 Table 'category' already exists


В общем изменения не видит, миграция не происходит.
Способ выше работал без ошибок, если добавлять новые поля через миграцию. А вот ключ не добавляет. Говорит ничего не изменилось, ну и далее как следствие ошибки.

Как добавить ключ, связывающий поля category.id и video.category_id?
  • Вопрос задан
  • 138 просмотров
Подписаться 1 Простой 2 комментария
Решения вопроса 1
Maksclub
@Maksclub
maksfedorov.ru
Вы проделываете много работы магическими генерирующими командами, игнорируя результат (сами файлы мигарций и их инструкций)

У вас не проходит одна миграция — видимо, вы ее уже пытались выполнить, выполнилась част ьпо созданию таблицы и все упало. Надо фиксануть руками — сравнить миграцию и состояние БД и все наладить.

Тут еще подводный камень, тк миграция старая ен выполнена, то возможно, чт ов ней часть иснтрукций будет конфликтовать с последующими генерациями, которые вы генерируете — тк состав миграции не смотрит на инструкции в предыдущих, а просто на основании схемы в БД и в коде. Тогда как старая битая миграция имеет часть инструкций, которые сломают схему БД к моменту работы следующей

Совет: просто посмотрите, чего не работает миграция, приведите БД руками к нужному состоянию или миграции к новому виду.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы