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

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

0

Решение

Согласно документам доктрины, сопоставление множества таблиц с одной сущностью невозможно в архитектуре доктрины. Таким образом, любое решение должно быть за пределами доктрины 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); }

}

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

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]