使用inverseJoin关联列失败:如何通过GeoProvinceEntity获取Freelance的Region?
问题:Freelance表关联获取Region数据报错
表结构说明
- freelance表
| id | province_id |
- geo_province_entity表
| id | name | region_id |
- geo_region_entity表
| id | name | nation_id |
当前错误的关联代码
我尝试在Freelance实体中直接关联GeoRegionEntity,代码如下:
/** * @ORM\OneToOne(targetEntity="App\PageBundle\Entity\GeoRegionEntity") * @ORM\JoinTable(name="geo_province_entity", * joinColumns={@ORM\JoinColumn(name="region_id", referencedColumnName="id")}, * inverseJoinColumns={@ORM\JoinColumn(name="province_id", referencedColumnName="id")} * ) */ protected $region;
执行后出现错误:
Column not found: 1054 Unknown column 'f0_.region_id' in 'field list'
正常工作的Province关联代码
而我在Freelance中关联GeoProvinceEntity的代码是正常的:
/** * @ORM\ManyToOne(targetEntity="App\PageBundle\Entity\GeoProvinceEntity", inversedBy="geo_province_entity") * @ORM\JoinColumn(name="province_id", referencedColumnName="id") */ protected $province;
需求
需要通过geo_province_entity表的region_id字段,在获取Freelance数据时同时拿到对应的Region名称。
解决方案
方案一:利用已有的Province关联(推荐)
既然Freelance到Province的关联已经正常工作,只需要在GeoProvinceEntity中添加到GeoRegionEntity的关联即可,不需要在Freelance中直接写Region关联:
在GeoProvinceEntity中添加代码:
/** * @ORM\ManyToOne(targetEntity="App\PageBundle\Entity\GeoRegionEntity") * @ORM\JoinColumn(name="region_id", referencedColumnName="id") */ protected $region; // 同时添加对应的getter方法 public function getRegion() { return $this->region; }
之后在获取Freelance数据时,直接通过$freelance->getProvince()->getRegion()就能拿到对应的Region对象,进而获取名称。
方案二:在Freelance中直接关联Region(不推荐,破坏层级关系)
如果一定要在Freelance中直接定义Region关联,需要修正JoinTable的配置,确保ORM能正确找到关联路径:
/** * @ORM\ManyToOne(targetEntity="App\PageBundle\Entity\GeoRegionEntity") * @ORM\JoinTable( * name="geo_province_entity", * joinColumns={ * @ORM\JoinColumn(name="province_id", referencedColumnName="province_id", table="freelance") * }, * inverseJoinColumns={ * @ORM\JoinColumn(name="region_id", referencedColumnName="id") * } * ) */ protected $region;
错误原因分析
你之前的代码有两个核心问题:
- 关联类型错误:一个Region对应多个Province和Freelance,应该用
ManyToOne而非OneToOne; - JoinColumn配置错误:
joinColumns里的name指定为region_id,导致ORM错误地去freelance表中寻找该字段,但freelance表只有province_id,因此触发“字段不存在”的报错。
内容的提问来源于stack exchange,提问作者sfarzoso
相关产品推荐
相关产品推荐

