使用教义保存日期字段

Posted

技术标签:

【中文标题】使用教义保存日期字段【英文标题】:Saving Date field with doctrine 【发布时间】:2019-09-20 04:52:24 【问题描述】:

在我的应用程序中,我将带有学说的数据保存到 mysql 数据库中。 对我来说,保存日期而不是时间就足够了,因此我为我的数据库字段选择了日期格式。

在我的 Symfony 4 应用程序的实体中,如下所示:

/**
 * @var DateTime
 *
 * @ORM\Column(name="create_date", type="date", nullable=false, options="default" = "CURRENT_TIMESTAMP")
 * @Assert\NotBlank
 */
private $createDate;


/**
 * @param DateTime $createDate
 *
 * @return Asset
 */
public function setCreateDate(DateTime $createDate)

    $this->createDate = $createDate;

    return $this;

生成的 SQL 语句如下所示:

INSERT INTO asset 
(name, create_date, beide, comment, amount, user_id, category_id) 
VALUES 
("Schmeckerlis","2019-01-19 16:03:53",0,"",7.34,345,345)

如您所见,添加了时间。 这是您如何使用教义设置日期字段的方式吗?

是否必须将其更改为 DateTime 或 Timestamp 字段?

我应该删除实体中的默认值吗?

https://www.doctrine-project.org/projects/doctrine-dbal/en/2.6/reference/types.html#date 说如下:

“日期: 映射和转换没有时间和时区信息的日期数据。如果你知道要存储的数据总是只需要一个没有时间和时区信息的日期,你应该考虑使用这种类型。从数据库中检索的值始终转换为 php 的 \DateTime 对象,如果不存在数据,则为 null。"

【问题讨论】:

【参考方案1】:

CURRENT_TIMESTAMP 将日期和时间返回为YYYY-MM-DD HH-MM-SS。如果我理解正确,您只需要 YYYY-MM-DD 部分。

为此,您必须删除options="default" = "CURRENT_TIMESTAMP" 并在实体的构造方法中执行此操作。每次你做new Entity()时都会调用这个。

public function __construct()

    $date = new \DateTime();
    $this->createDate = $date->format('Y-m-d');

【讨论】:

为什么要用时间格式化呢?在日志中的 Insert 语句中我还有时间: INSERT INTO assets (name, create_date, beide, comment, amount, user_id, category_id) VALUES (?, ?, ?, ?, ?, ?, ?) "file ":"/var/www/sbudget/vendor/symfony/doctrine-bridge/Logger/DbalLogger.php" "1":"Leckerlis","2":"2019-01-19 06:05:30" ,"3":0,"4":"","5":7.34,"6":559,"7":559 是的,插入有效,但尝试插入错误对我来说看起来不干净格式。 Ups,对不起,我忘了从日期格式中删除 H:i:s 部分 我刚刚尝试了您的解决方案。虽然这个解决方案听起来合乎逻辑,但我仍然在插入语句中有 Datetime。测试正在通过,所以从这个角度来看没有问题并且数据插入正确。奇怪的是,似乎没有选项可以用教义正确设置它。

以上是关于使用教义保存日期字段的主要内容,如果未能解决你的问题,请参考以下文章

如何在教义中进行复杂的SQL查询

教义 2.1 - 日期时间问题

doctrine / dbal-尝试将字符串字段更改为日期时出错

Symfony 4 - 设置日期时间

将日期字段保存到 Parse:键的类型无效,预期日期,但得到字符串

CloudKit,无法将 NSDate 保存到日期/时间字段,“无效日期”