2012-10-26 3 views
1

Я пытаюсь использовать Doctrine с плохо разработанной базой данных PostgreSQL. В некоторых таблицах есть поля DATE и TIME, которые должны быть полями TIMESTAMP.Есть ли способ сопоставить несколько полей в одно свойство?

Возможно ли сопоставить пару полей DATE и TIME с атрибутом DateTime на моих классах?

+0

Какая версия доктрины? – j0k

+0

Я использую 2.3.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 Params, как это:

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() поскольку учение нуждается в DateTime экземпляр как дата, время и временная метка.

Это дает вам простой интерфейс для поддержки вашего кода, но позволяет сделать абстракцию схемы базы данных.

+0

Отличное решение, но как мои DQL-запросы должны быть написаны? –

0

Вы также можете создать представление, в котором эти поля объединены в один. Затем из ваших классов модели используйте представление вместо реальных таблиц.

+0

Я думал об этом, но необходимость иметь дело с правилами просмотра для upserts выглядит сложнее, чем чистое PHP-решение. –

Смежные вопросы