我有一个与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
答案 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的值......