PHP Doctrine 2 ORM: объект, не являющийся сущностью, как атрибут в entity

#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.