是否可以引用除“&id”之外的列?对于JoinColumn?

时间:2012-01-19 01:20:18

标签: php doctrine-orm

我有一个与Item实体有ManyToOne关系的Category实体。我希望它们由Category id以外的字段加入(在本例中为id2字段)。我的架构如下所示。

class Item {
    /**
     * @ORM\Id
     * @ORM\Column(name = "id", type = "integer")
     * @ORM\GeneratedValue(strategy = "AUTO")
     */
    protected $id;
    /**
     * @ORM\ManyToOne(targetEntity = "Category")
     * @ORM\JoinColumn(name = "category_id", referencedColumnName = "id2")
     */
    protected $category;
}

class Category {
    /**
     * @ORM\Id
     * @ORM\Column(name = "id", type = "integer")
     * @ORM\GeneratedValue(strategy = "AUTO")
     */
    protected $id;
    /**
     * @ORM\Column(name = "id2", type = "string", length = "255", unique = "true")
     */
    protected $id2;

当我尝试保存Item时,我收到此错误:

  

注意:未定义索引:vendor / doctrine / lib / Doctrine / ORM / Persisters / BasicEntityPersister.php第511行中的id2

果然,如果我在id2注释中将id更改为JoinColumn,一切正常,但我需要通过id2连接实体。这可能吗?

修改
根据官方的Doctrine 2文档,我想要实现的目标是不可能的。

  

无法使用指向非主键的连接列。   Doctrine会认为这些是主键并创建延迟加载   代理与数据,这可能会导致意外的结果。教义   出于性能原因,可能无法验证其正确性   在运行时设置,但只能通过Validate Schema命令。

来源:http://www.doctrine-project.org/docs/orm/2.1/en/reference/limitations-and-known-issues.html

2 个答案:

答案 0 :(得分:7)

我认为Doctrine希望这些是主键,来自the docs

  

name:保存此关系的外键标识符的列名。

从代码示例中跳出来的另一件事是 category.id2 type string ,我至少会期待它是一个整数,但也可能需要 @JoinColumn 才能正常工作。

您可以在 category.id2 上使用@Index,然后将其保留为字符串;无论如何都值得一试。

答案 1 :(得分:4)

报告。我能够在Many2One(非定向)关系中加入非PK,但我的对象无法以正常方式加载。它必须加载DQL,如:

SELECT d,u FROM DEntity d
    JOIN d.userAccount u

这样我就不再收到错误了:错过了主键ID的值......