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