2014-12-05 16 views
4

我不能让下面的代码行为像它应该(删除过期的记录)。简单的测试代码:now()和db Expression在yii2/mysql中的奇怪行为

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 

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

回答

1

好了,最后SQL查询:

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

而不是

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

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

编辑:作为在Yii问题跟踪器上解释,参数绑定是一个pdo功能,不要在db表达式中使用它。

+0

我没想到:)谢谢。 – Andrey 2014-12-05 11:02:13

+0

答复已更新。 – soju 2014-12-05 15:11:47