Doctrine2的三重分割映射问题

时间:2012-02-09 08:18:50

标签: php mysql doctrine-orm

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

我收到以下错误:

doctrine orm:validate-schema

[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个表共享一个主键。
  • Auth,其中包含user_id PK。
  • OurUsers共享PK的表Auth.user_id
  • EmailVerification共享PK的表OurUsers.user_id
  • 我也有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;

    /* ... */
}

我正在使用Dosctrine 2.1。

btw Doctrine 2.2验证映射是否正常,但在运行时我得到的错误与2.1相同。

3 个答案:

答案 0 :(得分:1)

我认为问题在于EmailVerfication指向OurUSers对Auth的意图,但错误信息却令人误解。我不确定三元映射是否可以从内部进行(我很确定我已经为这个实现了一个例外,我必须看看为什么没有触发)。

答案 1 :(得分:0)

您在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;

    /* ... */
}

OR

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

     /**
 * @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;

    /* ... */
}

答案 2 :(得分:0)

我认为切换到这样的事情会更好,它会更清晰,并且应该创造更少的问题:

/**
 * @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;

    /* ... */
}