我想在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正确重置这些字段?
当您在Propel中设置日期字段时,它会转到PropelDateTime
,它基本上是一个DateTime对象。
您的代码将生成一个错误的日期,因为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
?
通过直接触发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
。但是,如果您的环境需要它,您可以调整上面的代码。