PHP Doctrine 2 ORM:非实体对象作为实体中的属性

时间:2011-04-10 11:46:56

标签: php orm doctrine entity

我正在使用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个值包含在数据库表“objects”中。

有谁知道如何实现这个目标?

祝你好运

编辑: 我发现了一种解决方法,但它并不是最好的。

    /**
     * 
 * @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();
}

2 个答案:

答案 0 :(得分:3)

最简单的方法是将该字段设置为使用“对象”映射类型。

/**
 * @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;

一个缺点,据我所知,没有办法解决这个问题,就是你只能为该字段使用一个数据库列。因此,您无法使用DQL分别按x,y或z排序。

答案 1 :(得分:0)

只需配置你的getter和setter。在您的实体中就像这样

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。