Php 带有Doctrine2的三重分割映射问题

Php 带有Doctrine2的三重分割映射问题,php,mysql,doctrine-orm,Php,Mysql,Doctrine Orm,我在使用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

我在使用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.
我的设想如下:

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

    /* ... */
}
  • 我有3个表共享一个主键
  • Auth
    包含
    user\u id
    PK
  • OurUsers
    ,其中
    Auth.user\u id
    为共享主键
  • EmailVerification
    ,其中
    OurUsers.user\u id
    是共享PK
  • 我也有
    notoursers
    ——因此分裂了
实体声明如下:

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


顺便说一句原则2.2验证了映射的正确性,但我在运行时遇到了与2.1相同的错误。

您在JoinColumn语句中告诉我,您使用的是
用户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
上添加
注释,如下所示:

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

    /* ... */
}

我认为问题在于EmailVerfication指向我们的用户进行身份验证,但错误消息具有误导性。我不确定三重映射是否可以从内部实现(我很确定我在某些地方也实现了一个例外,我必须看看为什么没有触发它)。

我认为最好切换到类似这样的方式,它更清晰,应该会产生更少的问题:

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

    /* ... */
}

如果您将EmailVerification中的
referencedColumnName
更改为仅
“id”
,该怎么办?这样,它将引用OurUsers类中的id属性,这在术语上是指Auth中的user\u id。我想问题一定是在附近的某个地方,在这里发布之前尝试过它-不起作用。谢谢你的回复。我遵循了你的第二个解决方案。这就是我得到的错误:
类的对象OurUsers无法转换为string~…\doctor\ORM\UnitOfWork.php
。但至少现在它证明了这一点。我会尝试将
\uuu添加到字符串
,但如果它有效-这是一个黑客。切换到v2.2,它会尝试将
我们的用户
转换为
UnitOfWork::tryGetById
中的字符串。它接收的类看起来是要接收的正确类。你能在doctor-project.org/jira上添加一个票证,并在发生这种情况的地方添加堆栈跟踪吗?我考虑过这样做。但是,有一个但是。如果我不能控制模式怎么办?甚至,我是否应该改变我的DB设计,因为条令2不能支持三重分割,无论出于什么原因?