Doctrine2的三重拆分映射问题


Triple split mapping issue with Doctrine2

我在使用Doctrine2时遇到了一个奇怪的问题。

我得到以下错误:

条令orm:验证模式

[Mapping]  FAIL - The entity-class 'EmailVerification' mapping is invalid:
* The referenced column name 'id' does not have a corresponding field with this
 column name on the class 'OurUsers'.
[Database] OK - The database schema is in sync with the mapping files.

我的场景如下:

  • 我有3个表共享一个主键
  • 保存user_id PK的表Auth
  • OurUsers,其中Auth.user_id被共享PK
  • EmailVerification,其中OurUsers.user_id被共享PK
  • 我也有NotOurUsers,所以就分开了

实体声明如下:

/**
 * @Entity
 * @Table(name="auth")
 */
class Auth {
    /** @Id @Column(type="integer", name="user_id") @GeneratedValue @var int */
    private $id;
    /* ... */
}
/**
 * @Entity
 * @Table(name="our_users")
 */
class OurUsers {
    /**
     * @Id
     * @OneToOne(targetEntity="Auth")
     * @JoinColumn(nullable=false, name="user_id", referencedColumnName="user_id")
     * @var Auth
     */
    private $id;
    /* ... */
}
/**
 * @Entity
 * @Table(name="email_verification")
 */
class EmailVerification {
    /**
     * @Id
     * @OneToOne(targetEntity="OurUsers")
     * @JoinColumn(nullable=false, name="user_id", referencedColumnName="user_id")
     * @var OurUsers
     */
    private $id;
    /* ... */
}

我用的是Doctrine 2.1。

btwDoctrine 2.2验证映射是好的,但我在运行时遇到了与2.1相同的错误。

我认为问题是EmailVerfication指向OurUSers intead to Auth,但错误消息具有误导性。我不确定从内部来看三重映射是可能的(我很确定我为此实现了一个异常——在某些地方,我必须看看为什么没有触发它)。

在JoinColumn语句中告诉您使用user_id列。

但是OurUser::id的列定义默认情况下会创建一个id列。

您必须修改JoinColumn语句才能使用id:

/**
 * @Entity
 * @Table(name="email_verification")
 */
class EmailVerification {
    /**
     * @Id
     * @OneToOne(targetEntity="OurUsers")
     * @JoinColumn(nullable=false, name="user_id", referencedColumnName="id")
     * @var OurUsers
     */
    private $id;
    /* ... */
}

OurUser::id上添加Column注释,如下所示:

     /**
 * @Entity
 * @Table(name="our_users")
 */
class OurUsers {
    /**
     * @Id
     * @OneToOne(targetEntity="Auth")
     * @Column(type="integer", name="user_id")
     * @JoinColumn(nullable=false, name="user_id", referencedColumnName="user_id")
     * @var Auth
     */
    private $id;
    /* ... */
}

我认为切换到这样的东西会更好,它更清晰,应该会产生更少的问题:

/**
 * @Entity
 * @Table(name="auth")
 */
class Auth {
    /** @Id @Column(type="integer", name="user_id") @GeneratedValue @var int */
    private $id;
    /* ... */
}
/**
 * @Entity
 * @Table(name="our_users")
 */
class OurUsers {
    /**
     * @Id
     * @GeneratedValue
     */
    private $id;
    /**
     * @OneToOne(targetEntity="Auth")
     * @var Auth
     */
    private $auth;
    /* ... */
}
/**
 * @Entity
 * @Table(name="email_verification")
 */
class EmailVerification {
    /**
     * @Id
     * @GeneratedValue
     */
    private $id;
    /**
     * @OneToOne(targetEntity="OurUsers")
     * @var OurUsers
     */
    private $ourUser;
    /* ... */
}