2

我想用 MySql 日期时间列中的 Propel 将记录的日期时间值重置为其默认值0000-00-00 00:00:00。这就是我尝试过的方式。

$zeroDate = new DateTime();
$zeroDate->setDate(0, 0, 0);
$zeroDate->setTime(0, 0, 0);
$changedRow = BookQuery::create()->findPk($bookId)->setPublishedAt($zeroDate);
if($changedRow->isModified()) {
    try {
        $changedRow->save();
    } catch (Exception $exc) {
        $this->logger->debug(__METHOD__ . " " . $exc->getMessage());
    }
}

我也试过这个。

$changedRow = BookQuery::create()->findPk($bookId)->setPublishedAt("0000-00-00 00:00:00");
if($changedRow->isModified()) {
    try {
        $changedRow->save();
    } catch (Exception $exc) {
        $this->logger->debug(__METHOD__ . " " . $exc->getMessage());
    }
}

两种变体都会产生错误

Unable to execute UPDATE statement [...]: Invalid datetime format: 1292 Incorrect datetime value: '-0001-11-30 00:00:00' for column 'published_at' at row 1]

因为 Propel 试图插入负的日期时间值。如何使用 Propel 正确重置这些字段?

4

2 回答 2

2

当您在 Propel 中设置日期字段时,它会转到PropelDateTime,这基本上是一个 DateTime 对象。

您的代码将生成一个错误的 date,因为0000-00-00 00:00:00它不是一个有效的日期:

<?php

$zeroDate = new DateTime();
$zeroDate->setDate(0, 0, 0);
$zeroDate->setTime(0, 0, 0);

var_dump($zeroDate);

// object(DateTime)#1 (3) { ["date"]=> string(20) "-0001-11-30 00:00:00" ["timezone_type"]=> int(3) ["timezone"]=> string(3) "UTC" }

您可以将 Propel 中的日期设置为无效日期。

为什么要设置日期0000-00-00 00:00:00?为什么不null呢?

于 2013-08-30T19:31:30.580 回答
1

通过直接触发 SQL 来更新记录,如下所示。

[...]

try {
    $con = Propel::getConnection(BookPeer::DATABASE_NAME);
    $sql = "UPDATE `book` SET "
            . "`published_at`='0000-00-00 00:00:00' "
            . "WHERE id=".$bookId;
    $stmt = $con->prepare($sql);
    $stmt->execute();
} catch(Exception $exc) {
    $this->logger->err(__METHOD__ . " " . $exc->getMessage());
}

[...]

尽管此解决方案有效,但它不是一个好的做法,因为它绕过了使用 ORM 提供的更高级的函数。一种更简洁的方法是让值默认为,NULL而不是j0k在问题的评论中0000-00-00 00:00:00提到的那样。但是如果你的环境需要,你可以修改上面的代码。

于 2013-09-04T13:06:32.887 回答