2012-05-10 6 views
5

ApacheのサーバーでDoctrine 2.2をPHP 5.3で使用しています。Doctrine 2:SQL Server 2008apmのDateTime coloumnを更新できません

これまでのところ、私は次のような問題につまずいてきました: SQLSTATE [22007]:[Microsoft]の[SQL Serverネイティブクライアント10.0] [SQL Serverの]の変換が失敗した私は、私が取得日時列を更新しようとすると 文字列から日付および/または時刻を変換します。

私は今までに列に乗ってそれを使って1日だけ新しい日付を設定しました......同じ結果になりました。

代わりに、データベースの列とエンティティの列の両方をdatetimeからdateに変更すると、意図した通りに機能します。

私の主な問題は、datetime列を使用する必要があるフィールドがいくつかあることです。ここで

は私のコードです:

(誕生日は私が日付に変更カラムであった....そしてそれは私のために可能であるいくつかの列の一つである):

//This returns the datetime object that represents birthdate from the database 
$help=$object->getBirthDate(); 
$help->setTimestamp(mktime($time[0],$time[1],$time[2],$date[2],$date[1],$date[0])); 
$help->format(\DateTime::ISO8601); 
$object->setBirthDate($help); 

誰かが知っていますここでの回避策ですか?

ここのお手伝いをよろしくお願いいたします。

答えて

0

datetimeフィールドにはどのような価値がありますか?あなたは2.3で解決されるように、教義2.2にDatetimeインスタンスに

$entity->setDate(new \Datetime()); 
+0

はい、私はdatetime型のインスタンスを渡しています。私がしているのは次の通りです(生まれた日は私が今日まで変わったコラムでした....それが私にとって可能な数少ない列の1つです)。 $ help- $ object-> getBirthDate(); //データベースからの生年月日を表すdatetimeオブジェクトを返します $ help-> setTimestamp(mktime($ time [0]、$ time [1]、$ time [2]、$ date [2]、$ date [ 1]、$ date [0])); $ help-> format(\ DateTime :: ISO8601); $ object-> setBirthDate($ help); – Thomas

6

その公式のバグを渡す必要があります。

マイクロ秒が文字列に間違った量の0でキャストされています。

回避策:ファイル /Doctrine/DBAL/Types/DateTimeType.phpで 変更機能convertToDatabaseValue:

public function convertToDatabaseValue($value, AbstractPlatform $platform) 
{ 
    if($value === null) 
     return null; 

    $value = $value->format($platform->getDateTimeFormatString()); 

    if(strlen($value) == 26 && 
     $platform->getDateTimeFormatString() == 'Y-m-d H:i:s.u' && 
     ($platform instanceof \Doctrine\DBAL\Platforms\SQLServer2008Platform 
      || 
     $platform instanceof \Doctrine\DBAL\Platforms\SQLServer2005Platform 
     )) 
     $value = substr($value, 0, \strlen($value)-3); 
    return $value; 
} 
+4

3年以上経った今、DBALは2.5です...まだ修正はありません:(私はDoctrine 1.xでSQL Serverを使用しているときにこのような回避策を講じなければなりませんでした。申し訳ありませんが、私は大部分のM $ショップでOSSを推進しようとしている人の一人です。このような問題は私のケースを助けません。 – DinoAmino

+0

どうすれば変更を避けることができますか? Composerの下にあるファイル?自分のタイプを登録するにはどうすればいいですか? –

+0

これは古いプロジェクトの1つでこのバグを修正するのに役立ちました –

3

私は教義2.5でこの問題に遭遇したとSQL Server 2012の問題は、データベースのことですフィールドはDATETIMEタイプですが、doctirneはSQLServer2008Platform以降でDATETIME2をサポートしています。

ベンダのディレクトリにあるファイルを編集しないでください。正解は、カスタムタイプを作成することです:Doctrine Custom Mapping Types。 Symfony config.ymlで

<?php 

namespace AppBundle\Doctrine\Type; 

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

class DateTime extends DateTimeType 
{ 
    private $dateTimeFormatString = 'Y-m-d H:i:s.000'; 

    public function convertToDatabaseValue($value, AbstractPlatform $platform) 
    { 
     return ($value !== null) 
      ? $value->format($this->dateTimeFormatString) : null; 
    } 

} 

そして:私の場合、私は現在のDateTimeTypeを拡張

types: 
     datetime: AppBundle\Doctrine\Type\DateTime 
+0

このクラスをsymfonyの外部に適用するには、 YourNameSpace \ DateTimeTypeSqlServer2012 '); 'どこにいてもrコードを入力してから日付を指定してください。 EntityManagerクラスを生成した関数に追加して、永続的な修正を加えました。 – shadi

関連する問題