将可嵌入字段设置为父实体映射的主键 - Doctrine2

Ben*_*Ben 9 php embeddable doctrine-orm

TLDR; Doctrine2:我需要知道是否可以在Parent Entities(或MappedSuperclass')映射中将Embeddable中的字段设置为主键.我已经知道如何从Embeddable的映射中设置主键,但这并不理想(参见"长版本").

长版; 我正在尝试使用Doctrine2 Embeddables为我的实体创建身份值对象.

这是我的问题......

  • 我在实体(MyEntity)中有两个不同的Embeddables(MyEntityId和OtherEntityId).

  • 我希望MyEntityId中的一个字段成为MyEntity的主键.

  • 由于我在同一实体中有两个标识嵌入,我想在实体映射文件中定义主键字段而不是可嵌入映射.

  • 如果我在嵌入式中定义主键,那么当我想对OtherEntityId执行相同操作时遇到问题(因为我在其他地方使用它).

  • 映射MyEntityId和OtherEntityId中的主键导致MyEntity具有复合键,这是我不想要的.

这是我目前的映射......

MyEntity:
    embedded:
        MyEntityId:
            class: 'MyEntityId'
            columnPrefix: false
        OtherEntityId:
            class: 'OtherEntityId'
            columnPrefix: false

MyEntityId:
    type: 'embeddable'
        id: 
            id:
                column: 'MyEntityId'
                type: 'string'

OtherEntityId:
    type: 'embeddable'
        id: 
            id:
                column: 'OtherEntityId'
                type: 'string'
Run Code Online (Sandbox Code Playgroud)

解决方案?

  • 创建两个单独的Embeddables来表示相同的Id值对象(不是非常干燥和太复杂)

  • 从实体映射Embeddable的主键字段(这可能吗?我在文档中找不到它)

小智 0

我使用 Doctrine Types https://www.doctrine-project.org/projects/doctrine-orm/en/2.13/cookbook/custom-mapping-types.html#custom-mapping-types而不是 Embeddables 来实现这一点,所以对于系统中的每个ID我都有一个单独的类型。这是一点额外的代码,但至少我每个 ID 只有一个 VO。

使用类型,您可以像这样实现您的实体:

class Post
{
    #[ORM\Id]
    #[ORM\Column(name: 'id', type: 'PostId')]
    private PostId $postId;

    #[ORM\Column(type: 'UserId')]
    private UserId $userId;
}
Run Code Online (Sandbox Code Playgroud)