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
    )
));

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

所需的 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''
4

2 回答 2

1
$this->find('all', array(
    'conditions' => array(
        'NOW() BETWEEN Promotion.start AND Promotion.end',
        'Promotion.active' => 1
    )
));
于 2012-10-24T15:01:45.973 回答
0

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

$this->find('all', array(
    'conditions' => array(
        "'" . date('Y-m-d') . "' BETWEEN Promotion.start AND Promotion.end",
        'Promotion.active' => 1
    )
));
于 2012-10-24T16:20:36.273 回答