首页 > 解决方案 > Doctrine ORM 通过非主键获取外部实体

问题描述

我试图通过没有主键来引用外国实体

由于兼容性原因和其他我无法控制的原因,我有一张我可能无法更改的表格。它是一个简单的地区/国家,具有主要的自动增量、唯一代码(如“我们”)和其他非相关字段。

到目前为止,该项目还没有任何原则,项目中的一些表通过id引用,一些通过代码引用

我想像这样引用这个实体:

    /**
     * @ORM\ManyToOne(targetEntity="Country")
     * @ORM\JoinColumn(name="country", referencedColumnName="code")
     *
     *  @var Country
     */
    private $countryEntity;

其他一些实体确实使用id代替。我不能同时使用@ORM\Id两者,因为我需要同时查询它。我不想使用第二个查询来获取Country实体。我需要保留idcode

标签: mysqldoctrine

解决方案


您不能通过非主键字段引用另一个表。

https://www.doctrine-project.org/projects/doctrine-orm/en/2.8/reference/limitations-and-known-issues.html#join-columns-with-non-primary-keys

您应该迁移数据库以在与国家表的所有关系中使用主键。

您可以使用这样的查询迁移数据

UPDATE target_table SET country_id = (SELECT id FROM country WHERE country.code = target_table.country_entity_code);

推荐阅读