【问题标题】:How to handle default values for a DateTime type in Doctrine2 SELECT query?如何在 Doctrine2 SELECT 查询中处理 DateTime 类型的默认值?
【发布时间】:2017-06-06 19:50:25
【问题描述】:

我有以下 Doctrine2 实体:

<?php

use Doctrine\ORM\Mapping as ORM;
use Gedmo\Timestampable\Traits\TimestampableEntity;
/**
 * @ORM\Entity
 */
class Account
{
    use TimestampableEntity;

    /**
     * @var integer
     *
     * @ORM\Id
     * @ORM\Column(type="integer", unique=true, nullable=false)
     */
    private $id;
}

如您所见,我将 Gedmo Timestampable 与捆绑包提供的 Trait 一起使用。它工作正常。

当我获取数据并且列 updated_atNULL 0000-00-00 00:00:00 的形式出现时,就会出现问题。对于这种情况,DateTime 对象将被转换为 invalid 日期,如下所示:

‌array (
  'RowId' => 26944,
  'synchflag' => 1,
  'updatedAt' => 
  DateTime::__set_state(array(
     'date' => '-0001-11-30 00:00:00.000000',
     'timezone_type' => 3,
     'timezone' => 'UTC',
  )),
)

我确实检查了docs,但没有任何帮助(或者至少我没有找到它,如果你让我知道的话)

处理这个问题的正确方法是什么?

编辑:

也许这里正确的问题应该是:如果updated_at0000-00-00 00:00:00 的形式出现,我如何将它变成NOW()?您可能会注意到getUpdatedAt() 根据获取的数据返回DateTimeSELECT声明有什么活动吗?

【问题讨论】:

  • 在我的实体中,updated_at 设置为等于 created_at。没有遇到这个麻烦
  • 你能调试一下为什么你的 updatedAt 属性为空吗?创建实体触发器设置 createdAt/updatedAt 属性。

标签: php symfony doctrine-orm doctrine


【解决方案1】:

由于问题是数据库已经有这些无效值,您可以创建自己的学说 datetime 类型,以便在从数据库中读取该无效值时转换为 null:

<?php
namespace AppBundle\Doctrine\DBAL;

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

class MyDateTimeType extends DateTimeType
{


   public function convertToPHPValue($value, AbstractPlatform $platform)
   {
       if (null === $value || $value instanceof \DateTime) {
           return $value;
       }

       if ('0000-00-00 00:00:00' === $value) {
          return null;
       }

       return parent::convertToPHPValue($value, $platform);
   }
}

并在学说配置中注册此自定义类型:

doctrine:
   dbal:
       types:
           datetime: AppBundle\Doctrine\DBAL\MyDateTimeType

注意:您可以使用正则表达式和/或日期时间有效性检查来增强此代码,而不是简单的比较

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-23
    • 1970-01-01
    • 2022-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多