有没有办法将多个字段映射到一个属性?

时间:2012-10-26 13:33:07

标签: php orm doctrine-orm

我正在尝试将Doctrine用于设计糟糕的PostgreSQL数据库。有些表的DATE和TIME字段应该是TIMESTAMP字段。

是否可以将一对DATE和TIME字段映射到我的类上的DateTime属性?

2 个答案:

答案 0 :(得分:1)

您可以创建一个方法getTimestamp(),该方法将返回new \DateTime($this->getDate()-­>format('Y-m-d') . ' ' . $this->getTime()->format('H:i:s'))个对象并创建一个setTimestamp(\DateTime $date)方法,该方法可以通过分别获取日期和时间来设置这两个值。

public function setDate(\DateTime $date)
{
    $this->date = $date;
}

public function getTime()
{
    return $date;
}

public function setTime(\DateTime $date)
{
    $this->date = $date;
}

public function getTime()
{
    return $date;
}

public function getTimeStamp() {
    return new \DateTime($this-­­>getDate()-­>format('Y-m-d') . ' ' . $this->getTime()->format('H:i:s'));
}

public function setTimeStamp(\DateTime $timestamp) {
    $this->setDate(new \DateTime($timestamp->format('Y-m-d'));
    $this->setTime(new \DateTime($timestamp->format('H:i:s'));
}

或类似的东西。然后,您可以在代码中专门使用get/setTimestamp()

<强> DQL

您将时间戳作为单个参数传递,并绑定2个参数,如下所示:

public function getSomething(\DateTime $timestamp, $someparam) {

    $dql = "SELECT ... FROM ... WHERE date = :date AND time = :time"

    // Create query and params binding
    // param('date', $timestamp-­>format('Y-m-d'));
    // param('time', $timestamp-­>format('H:i:s'));

    return $result;

}

您可能必须将params值包装在new \DateTime()中,因为doctrine需要DateTime实例作为日期,时间和时间戳。

这为您提供了一个支持代码的简单接口,但允许对数据库模式进行抽象。

答案 1 :(得分:0)

您还可以创建一个视图,其中这些字段合并为一个。然后从模型类中使用视图而不是真实的表。