3

私は、Zend 2 と doctrine 2 を oracle データベースで使用しているプロジェクトに取り組んでいます。私のエンティティには、datetime タイプのフィールド create_date があります。私のエンティティは以下です

class Personnel
{

/**
 * @ORM\Column(type="string",unique=true, nullable=false)
 */
protected $login_name;
/**
 * @ORM\Column(type="datetime")
 */
protected $create_date;
public function __construct()
{
    $this->create_date = new \DateTime("now");
}

 public function get_login_name()
{
    return $this->login_name;
}

public function set_login_name($login_name)
{
    $this->login_name = $login_name;
}

}

そして、このエンティティを

$user = new Personnel();
$user->set_login_name('Admin');
$this->getEntityManager()->persist($user);
$this->getEntityManager()->flush();

しかし、エラーが表示されました

    SQLSTATE[HY000]: 一般エラー: 1843 OCIStmtExecute: ORA-01843: 有効な月ではありません
     (ext\pdo_oci\oci_statement.c:148)

私を助けてください。

高度なthx

4

2 に答える 2

0

OCI8 を使用していても、Doctrine はデフォルトでは呼び出しません。私の意見では、これはバグではありません。なぜなら、NLS パラメータを DB で直接変更できるため、OracleSessionInit に接続するたびに呼び出す必要がないからです。セッションあたりのクエリが 1 つ少なくなります。:)

これを解決する別の方法は、\Doctrine\ORM\EntityManager のインスタンスを取得し、以下のように OracleSessionInit を設定することです。この例で行ったように、新しい値を持つ配列を「NLS_SORT」に渡すことで、デフォルトのセッション変数を変更することもできます。

Module.php

public function getServiceConfig() {
    return array(
        'initializers' => array(
            function($instance, $services) {
                if ($instance instanceof \Doctrine\ORM\EntityManager) {
                    $instance->getEventManager()->addEventSubscriber(new \Doctrine\DBAL\Event\Listeners\OracleSessionInit(array(
                        'NLS_SORT' => 'WEST_EUROPEAN_AI',
                    )));
                }
            },
        ),
    );
}

Initializer: ServiceManager がクラスの新しいインスタンスを作成するたびに実行されるコールバック。これらは通常、そのクラスが特定のインターフェイスを実装している場合に、新しいクラス インスタンスにオブジェクトを挿入するために使用されます。

初期化子と Zend\ServiceManager 構成の詳細については、こちらを参照してください。

于 2015-11-21T21:22:04.833 に答える