带有多个表的Doctrine OneToOne

时间:2017-09-18 06:35:03

标签: php doctrine-orm dql zend-framework3

我正在使用doctrine 2和zend framework 3.我得到了一个实体“Project”,其中OneToOne关系为“projectdetails”。 ProjectDetails在多个表之间分割,具体取决于项目字段“type”。

是否有一种简单的方法可以告诉doctrine哪个表用于项目详细信息取决于类型字段值?

1 个答案:

答案 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;运行迁移。最后用上述关联替换后一个字段。