2015-11-24 65 views
0

在我的遺留代碼中,我有這個類。 。 。教義是否支持複合實體?

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時,我該如何去創建這樣一個組合實體而無需進行轉義從現在開始,很多現有的遺留代碼都去了嗎?

有沒有不同的方法來解決這個問題? 我目前做的是分別加載兩個Doctrine實體,然後使用工廠方法來填充上面的現有對象。基本上我做

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

所以我通過OOP解決了這個問題。對更多以學說爲中心的方法感到好奇。

回答

1

根據doctrine docs,許多表映射到一個實體是不可能的教條架構。所以,任何解決方案都必須在教條API邊界之外。欲瞭解更多信息,看看這個文檔部分: http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/limitations-and-known-issues.html

我認爲最好的辦法是改變你的汽車類是一種適配器,這樣的:

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); } 

} 

做這樣你保持您的數據通過實體保持最新和一致。