在我的条件下使用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''
答案 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
)
));