如何使用 Symfony Doctrine 持久化枚举(实体字段类型:“enum”)

Dav*_*idG 1 php enums doctrine

我有一个枚举(感谢 php 8.1),我想将其记录在数据库中。该字段的类型为Enum。通过Adminer进行SQL查询,没有问题。

UPDATE `users` SET `grade` = 1, WHERE `id` = '51';
Run Code Online (Sandbox Code Playgroud)

在这种情况下,在 Adminer 中,我可以在成绩列中看到“A5”(值为 1 的枚举名称)

但是对于 Doctrine 和 symfony 形式,数据不会被持久化(仅在这个字段上)。我没有错误。

if ($form->isSubmitted() && $form->isValid()){

        $entityManager = $this->getDoctrine()->getManager();
        $entityManager->persist($user);
        $entityManager->flush();
Run Code Online (Sandbox Code Playgroud)

这是 ProfileType 中的“添加”

            ->add('grade', ChoiceType::class, [
            'data' => $user ? $user->getGrade() : GradeEnum::D1,
            'placeholder' => 'Choose an option',
            'required' => false,
            'choices' => [
                GradeEnum::D1->name => GradeEnum::D1,
                GradeEnum::D2->name => GradeEnum::D2,
                GradeEnum::C1->name => GradeEnum::C1,
                GradeEnum::C2->name => GradeEnum::C2,
                GradeEnum::B1->name => GradeEnum::B1,
                GradeEnum::B2->name => GradeEnum::B2,
                GradeEnum::A1->name => GradeEnum::A1,
                GradeEnum::A2->name => GradeEnum::A2,
                GradeEnum::A3->name => GradeEnum::A3,
                GradeEnum::A4->name => GradeEnum::A4,
                GradeEnum::A5->name => GradeEnum::A5,
                GradeEnum::A5plus->name => GradeEnum::A5plus,
            ],
            'attr' => [
                'class' => 'mb-3'
            ],
            'label' => 'Grade'
        ])
Run Code Online (Sandbox Code Playgroud)

我把表格转储了。我得到一个枚举。

App\Enum\GradeEnum {#332
 +name: "A5"
 +value: 1
}
Run Code Online (Sandbox Code Playgroud)

如果我尝试使用其他类型(例如整数)保留该字段中的数据,则会出错。这个是正常的。但为什么枚举不坚持原则呢?

gre*_*ire 6

从版本 2.11 开始,ORM 支持 php 8 枚举

enum Suit: string {
    case Hearts = 'H';
    case Diamonds = 'D';
    case Clubs = 'C';
    case Spades = 'S';
}

#[Entity]
class Card
{
    /** ... */

    #[Column(type: 'string', enumType: Suit::class)]
    public $suit;
} 
Run Code Online (Sandbox Code Playgroud)

您可以在官方博客文章中阅读更多相关内容。官方文档应该很快就会发布。