我正在使用doctrine 2和zend framework 3.我得到了一个实体“Project”,其中OneToOne关系为“projectdetails”。 ProjectDetails在多个表之间分割,具体取决于项目字段“type”。
是否有一种简单的方法可以告诉doctrine哪个表用于项目详细信息取决于类型字段值?
答案 0 :(得分:2)
您可以为每个项目详细信息表定义“OneToOne”关联:
public MyModule extends AbstractModule {
@Override
protected void configure() {}
@Singleton
@Provides
public Engine provideEngine(){
Map<String, String> engineProperties = new HashMap<>();
engineProperties.put("brand", "some brand");
engineProperties.put("capacity", "2.6 litres");
return new Engine(engineProperties);
}
@Inject
@Provides
public Car provideCar(Engine engine){
Car car = new Car(engine);
return car;
}
}
再添加projectdetails表。 然后使用getter函数根据类型获得正确的关系:
/**
* @OneToOne(targetEntity="ProjectDetails1")
* @JoinColumn(name="project_details_id", referencedColumnName="id")
*/
private $projectDetails1;
/**
* @OneToOne(targetEntity="ProjectDetails2")
* @JoinColumn(name="project_details_id", referencedColumnName="id")
*/
private $projectDetails2;
更新 :在这种情况下,您无法使用doctrine控制台工具生成关联,因为无法将“project_details_id”上的外键设置为2个不同的表。
要解决此问题,应使用迁移创建整数类型的列 project_details_id ,或者您可以在Project实体中定义字段:
function getProjectDetails() {
if($this->type === 'type1') {
return $this->projectDetails1;
}
elseif($this->type === 'type2') {
return $this->projectDetails2;
}
}
生成&amp;运行迁移。最后用上述关联替换后一个字段。