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 に答える