Symfony Symfony 6 миграции, не могу разобраться.

Jaysid

Новичок
Я в php не давно и пытаюсь сейчас разобраться с symfony.
Но че то я запутался в миграциях. Версия симфони 6. Т.к. потом именно эту версию придется использовать.
Создаю сущность через make. По умолчанию создается с атрибутами. Я думаю т.к. 6 версия"php": ">=8.0.2",

PHP:
#[Column(type: 'string', length: 255)]
private $prop;
мне нужно добавить значение по умолчанию, беру пример из доки доктрины, получается так

PHP:
#[Column(type: 'string', length: 255, options: ["default" => "value"])]
private $prop;

создаю миграцию, смотрю, вроде все норм, накатываю миграцию в бд.
Думаю надо проверить, как добавляется запись в бд, все ли норм. Создал тестовый контроллер, и руками добавляю запись типа такого. (для теста у сущности 2 свойства name обязательное и prop не обязательное где указано значение по умолчанию)


PHP:
#[Route('/test', name: 'test')]
public function test(EntityManagerInterface $entityManager): Response
{
    $test = new Test();
    $test->setName('test name'.);

    $entityManager->persist($test);
    $entityManager->flush();

    return new Response(sprintf('New test id #%d', $test->getId()));
}

получаю ошибку prop не может быть null. Странно думаю че за фигня.
В итоге получилось пофиксить эту ошибку только добавив аннотации вместо атрибута. (таблица в бд по прежнему существует)


PHP:
/**
* @Column(type="string", length=255, options={"default":"value"})
*/

после этого данные в таблицу добавляются без ошибок. Думаю наверно атрибуты не корректно работают, надо аннотации делать.

Создаю еще одну сущность допустим Test2 где так же есть поле по умолчанию и там сразу исправляю атрибут на аннотацию.
Хочу сделать миграцию новой сущности, пишу в консоли
doctrine:migrations:diff

создается вторая миграция, я ее сразу накатил в бд, и вот тут я не сразу, а позже заметил странную для меня вещь.
вторая миграция удалила поле из 1 миграции в которое я задавал значение по умолчанию, и создала 2 миграцию без поля где я указывал значение по умолчанию. Просто проигнорировало его и все.

В итоге я пока пытался понять что происходит, тестовым путем выяснил следующее.
1. Создавая сущность через make и добавляя к атрибуту поле значения по умолчанию. Миграция и таблица создается корректно, но не работает добавление записи.
2. Создавая сущность через make и заменяя атрибут на аннотации не корректно создается миграция и таблица. Отсутствуют поля где указаны значения по умолчанию.

Может кто подскажет что не так? Как это нужно правильно делать? Сейчас у меня получается нужно делать сначала с атрибутами, создавать миграции и потом менять атрибуты на аннотации и тогда только вроде работает. А может я что то нафигарил там уже пока разбирался.. Но я даже пробовал заново с нуля создать проект создать две сущности и все равно не работает без замены. Или пакета какого не хватает?
 

AmdY

Пью пиво
Команда форума
Вы забываете про php часть кода, он не знает про магию БД
PHP:
#[Column(type: 'string', length: 255, options: ["default" => "value"])]
private string $prop = 'value';
 

Jaysid

Новичок
хм, надо и в свойство напрямую прописывать значение... сейчас проверю...))
 

AmdY

Пью пиво
Команда форума
Надо понимать, что ОРМ нужна как раз для того, чтобы твой код мог работать даже без записи в БД. Твои сущности должны спокойно создаваться и работать даже без flash, потому нужно избегать магии БД вроде default. Только с нуллейблом лучше явно указывать и в пхп коде и в аннотациях, а то баги бывают. И помни что на пхп до 8.1 нативные антации не могут работать со вложенностью и надо прописывать через phpdoc
 

Jaysid

Новичок
Хотя сейчас вот так сделал и тоже все работает, так и оставил...

PHP:
#[Column(type: 'string', length: 255)]
private $prop = 'value';
а потом все таки вернул как было... посмотрим как дальше пойдет..
 
Последнее редактирование:
Сверху