Doctrine是否支持复合实体?

时间:2015-11-24 23:24:49

标签: php doctrine-orm doctrine composite legacy-code

在我的遗留代码中,我有这个课程。 。

class Motor
{
    //db table motor_part_sizes
    //physical dimensions relating to various screw sizes
    private $a;
    private $b;
    private $c;

    //db table motor_part_length
    //also dimensions relating to length
    private $adapter_length;
    private $motor_length;
}

遗留代码中的上述对象是从两个表中提取的。

将我的表实体转换为Doctrine时,我创建了两个实体。现在我的问题是现有的遗留代码希望上面的对象包含来自两个实体的数据。

我当然可以创建一个原始的SQL查询来加载上面的对象,这就是它在代码中的完成方式,但是当涉及到Doctrine时,如何创建这样一个复合实体而不必搜索一个来自get go的许多现有遗留代码?

有没有不同的方法来解决这个问题? 我目前所做的是分别加载两个Doctrine实体,然后使用工厂方法填充上面的现有对象。基本上我做

$motor->setDataFromTable1($data1);
$motor->setDataFromTable2($data2);

所以我通过OOP解决了这个问题。对更多以学说为中心的方法感到好奇。

1 个答案:

答案 0 :(得分:1)

根据学说文档,学说体系结构不可能将许多表映射到一个实体。因此,任何解决方案都必须在学说API边界之外。有关详细信息,请查看此文档部分: http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/limitations-and-known-issues.html

我认为最好的解决方案是将您的Motor类更改为一种适配器,如下所示:

class Motor {

    private TableEntityA $tableA;
    private TableEntityB $tableB;

    public function setTableEntityA($tableA) {
        $this->tableA = $tableA;
    }

    public function setTableEntityB($tableB) {
        $this->tableB = $tableB;
    }

    public function getFieldA1() { $this->tableA->getFieldA1(); }
    public function setFieldA1($value) { $this->tableA->setFieldA1($value); }

    public function getFieldA2() { $this->tableA->getFieldA2(); }
    public function setFieldA2($value) { $this->tableA->setFieldA2($value); }

    public function getFieldB1() { $this->tableB->getFieldB1(); }
    public function setFieldB1($value) { $this->tableB->setFieldB1($value); }

    public function getFieldB2() { $this->tableB->getFieldB2(); }
    public function setFieldB2($value) { $this->tableB->setFieldB2($value); }

}

通过这种方式,您可以通过实体保持数据的最新和一致性。