Поддерживает ли Doctrine составные объекты?

В моем устаревшем коде у меня есть этот класс. . .

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

Поэтому я решил это через ООП. Любопытно узнать о других подходах, ориентированных на доктрину.


person Dennis    schedule 24.11.2015    source источник


Ответы (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); }

}

Поступая таким образом, вы поддерживаете актуальность и согласованность своих данных с помощью сущностей.

person Jacobson    schedule 25.11.2015