CakePHP - 如何在查找条件中使用SQL NOW()

时间:2012-10-24 14:57:55

标签: cakephp cakephp-2.0

在我的条件下使用SQL函数NOW()时,我无法使任何查找操作正常工作。

我正在尝试构建一个查询说明:

所需的SQL:

WHERE (NOW() BETWEEN Promotion.start AND Promotion.end) AND Promotion.active = 1

我尝试了很多组合,但无论我在条件中使用NOW()时我做了什么,它都不起作用,因为查询Cake构建在模型字段周围放置'引号,因此它们被解释为MySQL作为字符串。

$this->find('all', array(
    'conditions' => array(
        '(NOW() BETWEEN ? AND ?)' => array('Promotion.start', 'Promotion.end'),
        'Promotion.active' => 1
    )
));

CakePHP创建了SQL:

注意BETWEEN()中模型字段周围的单引号,因此将它们视为字符串。

WHERE (NOW() BETWEEN 'Promotion.start' AND 'Promotion.end') AND `Promotion`.`active` = '1'

这也不起作用。

$this->find('all', array(
    'conditions' => array(
        'NOW() >=' => 'Promotion.start',
        'NOW() <=' => 'Promotion.end',
        'Promotion.active' => 1
    )
));

我知道为什么这些解决方案不起作用。这是因为如果模型字段是条件中的数组键而不是数组值,那么它们只被视为这样。

我知道如果我将整个BETWEEN()条件作为字符串放置,我可以使用它:

$this->find('all', array(
    'conditions' => array(
        'NOW() BETWEEN Promotion.start AND Promotion.end',
        'Promotion.active' => 1
    )
));

但是后来我没有得到Cake对SQL注入的保护。


同一问题的另一个例子是,更容易理解:

所需的SQL:

WHERE Promotion.start > NOW() AND Promotion.active = 1

所以我试试这个:

$this->find('all', array(
    'conditions' => array(
        'Promotion.start >' => 'NOW()',
        'Promotion.active' => 1
    )
));

再次它不起作用,因为Cake在NOW()部分周围放置'引号。

CakePHP创建了SQL:

WHERE `Promotion`.`start` > 'NOW()' AND `Promotion`.`active` = '1''

2 个答案:

答案 0 :(得分:1)

$this->find('all', array(
    'conditions' => array(
        'NOW() BETWEEN Promotion.start AND Promotion.end',
        'Promotion.active' => 1
    )
));

答案 1 :(得分:0)

最好不要使用NOW()作为函数,函数不使用索引。更好的解决方案是:

$this->find('all', array(
    'conditions' => array(
        "'" . date('Y-m-d') . "' BETWEEN Promotion.start AND Promotion.end",
        'Promotion.active' => 1
    )
));