php - yii2/mysql 中 now() 和 db\Expression 的奇怪行为

标签 php mysql activerecord yii2

我无法让以下代码正常运行(删除过期记录)。简单测试代码:

test_expire 表定义:

CREATE TABLE `test_expire` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `expire` timestamp NOT NULL,
 PRIMARY KEY (`id`)
);

代码:

TestExpire::deleteAll();

$record = new TestExpire();
$record->expire = new Expression("NOW() + INTERVAL 1 MONTH");
$record->save();

$record = new TestExpire();
$record->expire = new Expression("NOW() + INTERVAL 1 YEAR");
$record->save();

$records = TestExpire::find('expire > :expire', ['expire' => date('Y-m-d')])->all();
echo "Records (" . count($records) . "):\n";
foreach($records as $record) {
    echo "Expire: " . $record->expire . "\n";
}
TestExpire::deleteAll("expire < NOW()");
$records = TestExpire::find('expire > :expire', ['expire' => date('Y-m-d')])->all();
echo "Records after delete 1: " . count($records) . "\n";

TestExpire::deleteAll("expire < :expire", [':expire' => date('Y-m-d G:i:s')]);
$records = TestExpire::find('expire > :expire', ['expire' => date('Y-m-d')])->all();
echo "Records after delete 2: " . count($records) . "\n";

TestExpire::deleteAll("expire < :expire", [':expire' => new Expression("NOW()")]);
$records = TestExpire::find('expire > :expire', ['expire' => date('Y-m-d')])->all();
echo "Records after delete 3: " . count($records) . "\n";

好吧,我希望所有 deleteAll 表达式都相同,每个表达式都不会删除记录。但最后一个确实如此。这是输出:

Records (2):
Expire: 2015-01-05 14:52:02
Expire: 2015-12-05 14:52:02
Records after delete 1: 2
Records after delete 2: 2
Records after delete 3: 0

问题是它为什么会发生以及如何使其按预期工作?

最佳答案

那么,最后一个 sql 查询是:

DELETE FROM `test_expire` WHERE expire < 'NOW()';

代替

DELETE FROM `test_expire` WHERE expire < NOW();

感谢您报告这个错误,我在这里创建了一个问题:https://github.com/yiisoft/yii2/issues/6382

编辑:正如在 Yii 问题跟踪器上所解释的,参数绑定(bind)是一个 pdo 功能,不要将它与 db 表达式一起使用。

关于php - yii2/mysql 中 now() 和 db\Expression 的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27312579/

相关文章:

php - 在单个表上组合 2 个 sql 语句

mysql - ListView -用户评论

ruby-on-rails - 在 Rails 多态关联中查找父项

mysql - 如何通过连接表中的引用对查找记录?

php - 取结果 Mysql 赋值 PHP 变量

php - Google API Oauth 2.0 cron 作业?

php - 查询无法正确保存日期

ruby-on-rails - 根据日期重复记录 - Rails

php - Netbeans:解析文件时出错 - 如何处理?

php - 更新 mysql 中的逗号分隔列表