私の条件で 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''