2016-06-09 5 views
3

У меня проблема с типом Oracle DateTime в Symfony 2.7 + Doctrine. У меня есть стол с столбцом DateTime, который отображается в Symfony через Doctrine.Symfony + Doctrine Oracle DateTime issue issue

Когда я пытаюсь persiste относительного Entity я получил следующее сообщение об ошибке:

Could not convert database value "31-MAY-16 03.56.49.000000 PM" to Doctrine Type datetime. Expected format: Y-m-d H:i:s File: .../vendor/doctrine/dbal/lib/Doctrine/DBAL/Types/ConversionException.php Line: 63

Я не могу изменить формат по умолчанию в базе данных Oracle. Я ранее исправил проблему, изменив метод getDateTimeFormatString() в vendor/doctrine/dbal/lib/Doctrine/DBAL/Platforms/OraclePlatform.php и работал.

Однако, поскольку для развертывания моего приложения в рабочей среде я должен использовать Git и «компоновщик установки ...», все поставщики устанавливаются из репозитория Symfony; таким образом я потеряю изменения, которые я сделал в OraclePlatform.php

Чтобы решить эту проблему, не касаясь библиотеки verdors, я попытался установить следующие переменные Oracle ENV на HTTPD инициализации запуска сценария, но он не работает

export NLS_TIME_FORMAT="HH24:MI:SS"
export NLS_DATE_FORMAT="YYYY-MM-DD HH24:MI:SS"
export NLS_TIMESTAMP_FORMAT="YYYY-MM-DD HH24:MI:SS"
export NLS_TIMESTAMP_TZ_FORMAT="YYYY-MM-DD HH24:MI:SS TZH:TZM"

я нашел возможное решение в Known Vendor Issues в документации Doctrine о PostgreSQL, где они предлагают использовать VarDateTimeType переопределения типа, как это:

use Doctrine\DBAL\Types\Type; 

Type::overrideType('datetime', 'Doctrine\DBAL\Types\VarDateTimeType'); 
Type::overrideType('datetimetz', 'Doctrine\DBAL\Types\VarDateTimeType'); 
Type::overrideType('time', 'Doctrine\DBAL\Types\VarDateTimeType'); 

Этот шов является решением, однако я понятия не имею, как переопределить тип с помощью кода выше, но в основном, где поставить вышеуказанный код.

Есть ли у кого-нибудь идеи? С благодарностью

P.S. Я использую DateTime без часового пояса

+0

можете ли вы точно сказать, что такое тип столбца в Oracle? Версия базы данных Oracle. а также определение вашей собственности в доктрине –

+0

Точный тип столбца - ** TIMESTAMP **. Тип свойства Entity - ** DateTime **. Я импортировал сопоставление из существующей базы данных. Версия Oracle - это ** 11.2.0 ** – dalesma

ответ

-1

Я не знаю, о Symfony/Doctrine, но это легко исправить с регулярными OCI функциями:

$conn = oci_connect('username', 'password', 'connection_string'); 

// get the sysdate... 
$select = oci_parse($conn, 'select sysdate from dual'); 
oci_execute($select); 
print_r(oci_fetch_row($select)); 

// alter the session date format... 
$alter = oci_parse($conn, 'alter session set NLS_DATE_FORMAT=\'YYYY-MM-DD HH24:MI:SS\''); 
oci_execute($alter); 

// get the sysdate again... 
oci_execute($select); 
print_r(oci_fetch_row($select)); 

Это дает выход:

Array 
(
    [0] => 10-JUN-16 
) 
Array 
(
    [0] => 2016-06-10 13:39:34 
) 
+0

OracleSessionInit делает именно это. OP хочет переопределить _defaultSessionVars и не заботится о концепции нижних слоев. https://github.com/doctrine/dbal/blob/master/lib/Doctrine/DBAL/Event/Listeners/OracleSessionInit.php. –

0

Создайте пользовательский DBAL-тип, расширяющий DateTimeType и переопределите функцию convertToPHPValue (я скопировал класс VarDateTimeType, который не смог успешно преобразовать тип даты, который использовал моя установка Oracle):

<?php 

namespace YourCompany\SomeBundle\Doctrine\DBAL\Types; 

use Doctrine\DBAL\Platforms\AbstractPlatform; 
use Doctrine\DBAL\Types\ConversionException; 
use Doctrine\DBAL\Types\DateTimeType; 

class SillyDateTimeType extends DateTimeType 
{ 
    /** 
    * {@inheritdoc} 
    * @throws \Doctrine\DBAL\Types\ConversionException 
    */ 
    public function convertToPHPValue($value, AbstractPlatform $platform) 
    { 
     if ($value === null || $value instanceof \DateTime) { 
      return $value; 
     } 

     $val = \DateTime::createFromFormat('d-M-y H.i.s.u A', $value); 
     if (! $val instanceof \DateTime) { 
      throw ConversionException::conversionFailed($value, $this->getName()); 
     } 

     return $val; 
    } 
} 

Замените $val = \DateTime::createFromFormat('d-M-y H.i.s.u A', $value); в любом формате, который ваша установка вернет для этих столбцов.

Тогда просто зарегистрировать его под dbal в config.yml:

# app/config/config.yml 
doctrine: 
    dbal: 
     types: 
      sillydatetime: YourCompany\SomeBundle\Doctrine\DBAL\Types\SillyDateTimeType 

Теперь вы можете использовать sillydatetime (или что вы его называете) в любом месте в вашей спецификации типа столбца.