Doctrine ORM:NULL到DateTime转换错误

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Doctrine ORM:NULL到DateTime转换错误相关的知识,希望对你有一定的参考价值。

我使用php7,Symfony 2.8和Doctrine ORM 2.5。我有一个带有日期时间字段的实体:

 /** @ORMColumn(name="data_ordine", type="datetime", nullable=true) */
private $dataOrdine;

/**
 * @param mixed $dataOrdine
 */
public function setDataOrdine($dataOrdine = null)
{
    $this->dataOrdine = $dataOrdine;
}

/**
 * @return mixed
 */
public function getDataOrdine()
{
    return $this->dataOrdine;
}

当我尝试在mysql数据库上获取持久化实体的$ dataOrdine字段($ ordine-> getDataOrdine())时,如果dataOrdine列为NULL,我得到:

object(DateTime)#551 (3) {
  ["date"]=>
  string(27) "-0001-11-30 00:00:00.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(13) "Europe/Berlin"
}

而不是NULL

答案

我前段时间遇到过同样的问题。正如@goto所说,你的专栏不是NULL,因为new DateTime(NULL)是一个有效的陈述。

由于这正是发生在我身上的事情,我完全相信有问题的行的价值将以0000-00-00 00:00:00的形式出现,这使得new DateTime('0000-00-00 00:00:00')返回错误的日期。

$null_date = new DateTime(null);
$wrong_date = new DateTime('0000-00-00 00:00:00');

var_dump($null_date);
var_dump($wrong_date);

object(DateTime)#1 (3) {
  ["date"]=>
  string(26) "2018-01-17 13:22:01.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(10) "US/Pacific"
}

object(DateTime)#2 (3) {
  ["date"]=>
  string(27) "-0001-11-30 00:00:00.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(10) "US/Pacific"
}

我有一个我根本不喜欢的解决方法,而不是发布和接受的答案,我让DBA不允许NULL |这些列的无效日期。

更多信息:How to handle default values for a DateTime type in Doctrine2 SELECT query?

另一答案

有些客户在00:00:00值显示null。因此,请通过命令行客户端检查以确保(CLI显示正确的值)。然后只需更新为null,其值为0000-00-00 00:00:00

以上是关于Doctrine ORM:NULL到DateTime转换错误的主要内容,如果未能解决你的问题,请参考以下文章

Doctrine ORM 使用啥机制来创建“持久”对象?

Doctrine ORM CLI 工具不起作用

Doctrine ORM Association映射两列

Zend2 框架 - 给映射异常的 Doctrine ORM

在没有 Doctrine-ORM 注释的情况下填充字段集

Symfony2:传递给 Doctrine\ORM\EntityRepository::__construct() 的参数 2 必须是 Doctrine\ORM\Mapping\ClassMetada