#php #orm #doctrine #entity
#php #orm #доктрина #сущность
Вопрос:
Я использую Doctrine ORM 2. Я получил следующий класс сущности.
/**
* @Entity
* @Table(name="objects")
*/
class MyObject
{
/**
* @Id
* @GeneratedValue
* @Column(type="integer")
*/
private $id;
/**
* @var Coordinate
*/
private $coordinate;
}
class Coordinate
{
private $x;
private $y;
private $z;
}
Я хочу реализовать 3 значения координат в отдельном классе для лучшей обработки в php. Но в базе данных я хочу, чтобы 3 значения были включены в таблицу базы данных «объекты».
Кто-нибудь знает, как этого добиться?
С наилучшими пожеланиями
Редактировать: я нашел обходной путь, но он не самый приятный.
/**
*
* @var integer
* @Column(type="integer")
*/
private $x;
/**
*
* @var integer
* @Column(type="integer")
*/
private $y;
/**
*
* @var integer
* @Column(type="integer")
*/
private $z;
public function getCoordinate()
{
return new Coordinate($this->x, $this->y, $this->z);
}
public function setCoordinate(Coordinate $coord)
{
$this->x = $coord->getX();
$this->y = $coord->getY();
$this->z = $coord->getZ();
}
Ответ №1:
Самым простым способом было бы установить для этого поля тип сопоставления «object».
/**
* @Column(type="object")
*/
private $coordinate;
Затем, какой бы класс объекта вы ни ввели в это поле, Doctrine автоматически сериализует и отменяет сериализацию при его вставке и извлечении из базы данных.
Другой способ — создать пользовательский тип сопоставления — http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/cookbook/custom-mapping-types.html . При этом используется тот же метод, что и тип объекта, но позволяет точно указать, как объект будет преобразован между PHP и SQL.
Если бы используемый вами этот метод имел тип сопоставления с именем coordinate, вы бы просто объявили это для поля:
/**
* @Column(type="coordinate")
*/
private $coordinate;
Один недостаток, и, насколько я вижу, обойти его невозможно, заключается в том, что вы можете использовать только один столбец базы данных для поля. Таким образом, вы не смогли бы упорядочивать по x, y или z отдельно, используя DQL.
Ответ №2:
Просто настройте свои средства получения и установки. Как это в вашей сущности
public function setCoordinate (Coordinate $coordinate) {
$coordinateArr = $coordinate->getArrayCopy();
$this->coordinate = serialize($coordinateArr);
}
public function getCoordinate() {
$coordinateArr = unserialize($this->coordinate);
$coordinate = new Coordinate();
$coordinate->exchangeArray($coordinateArr);
return $coordinate;
}
Но если вы хотите выполнить поиск в sql, вам нужно использовать LIKE.