3

ユーザーがオフィスの部屋と設備を予約できる小さなWebアプリを作成しています。予約の場合、開始日と終了日を入力します。

ユーザーが(たとえば)2012-10-23に利用可能な車があるかどうかを調べようとし、データベースにすべての車のStart:2012-10-20とEnd:の予約日レコードが保持されている場合2012-10-25、すべての車を含めるにはどうすればよいですか?検索の日付エントリ間の日付?

変数は$date、日付検索フォームフィールドから値を取得します。

これは残念ながら機能せず、このクエリにdaysAsSqlを使用する方法がわかりません。

$conditions = array(
    'conditions' => array(
        '? BETWEEN ? AND ?' => array($date,'Equipment.date_start','Equipment.date_end'), 
    )));

$this->set('equipments', $this->Equipment->find('all', $conditions));
4

6 に答える 6

10

これにはもっと簡単な解決策がありますが、助けてくれてありがとう:

(検索の条件として:)

array('Equipment.date_start <= ' => $date,
      'Equipment.date_end >= ' => $date
     ),
于 2012-08-13T10:31:43.500 に答える
3

日付が1つあり、BETWEENを使用する場合

$date_start = start date;
$date_end = date_end;

$conditions = array(
    'conditions' => array(
        'date(Equipment.create) BETWEEN ? AND ?' => array($date_start, $date_end), 
    )));

$this->set('equipments', $this->Equipment->find('all', $conditions));

これは、FromANDToがある場合に当てはまります

あなたの場合

$date_start = start date;
$date_end = date_end;

$conditions = array(
    'conditions' => array(
        'Equipment.start_date >=' => array($date_start), 
        'Equipment.end_date <=' => array($date_end)
    ));

$this->set('equipments', $this->Equipment->find('all', $conditions));
于 2013-09-06T11:02:57.437 に答える
3

CakePHP BETWEENクエリの例を次に示します。

配列を変数として定義し、CakePHPのfind関数呼び出しでそれらの変数を使用しています。

// just return these two fields
$fields = array('uri', 'page_views');

// use this "between" range
$conditions = array('Event.date BETWEEN ? and ?' => array($start_date, $end_date));

// run the "select between" query
$results = $this->Event->find('all', 
         array('fields'=>$fields, 
               'conditions'=>$conditions));

からの参照

于 2017-06-08T11:44:57.967 に答える
2
$start = date('Y-m-d');
$end = date('Y-m-d', strtotime('+1 month'));

$conditions = array('Event.start <=' => $end, 'Event.end >=' => $start);

$this->Event->find('all', array('conditions' => $conditions));
于 2012-08-10T10:49:04.453 に答える
1

Cakephp 2.0を使用している場合、これが答えですhttp://book.cakephp.org/2.0/en/core-libraries/helpers/time.html#TimeHelper::daysAsSql

Cakephp 1.3を使用している場合は、TimeHelperを使用できます。インポートして、 http: //book.cakephp.org/1.3/en/view/1471/Formattingのドキュメントの例と同じ関数を使用してください。

于 2012-08-10T12:41:32.460 に答える
1

このBETWEEN-syntaxではデータベース列を使用できません。配列に文字列を割り当てると、CakePHPはそれらを引用します。データベースの設定に応じて、数値についても同じです。

CakePHPは、DBのフィールドタイプに応じて数値を引用します。–http://book.cakephp.org/2.0/en/models/retrieveing-your-data.html#complex-find-conditions
を参照してください

それでもを使用したい場合はBETWEEN、CakePHPがキーをエスケープせず、値のみをエスケープするため、配列キーにクエリを書き込むことができます。

CakePHPは配列値のみをエスケープします。キーにユーザーデータを入れないでください。そうすることで、SQLインジェクションに対して脆弱になります。–http://book.cakephp.org/2.0/en/models/retrieveing-your-data.html#complex-find-conditions
を参照してください

あなたの問題に関して:

$this->Model->find('all', array(
    'conditions' => array(
        '"YYYY-MM-DD" BETWEEN Model.date_start AND Model.date_end',
    ),
));

MySQLの日付と時刻の関数を使用することもできます。

$this->Model->find('all', array(
    'conditions' => array(
        'CURDATE() BETWEEN Model.date_start AND Model.date_end',
    ),
));

日付/時刻関数を使用する場合は、引用しないでください。特定の日付を使用する場合は、引用符で囲んでください。

于 2014-06-28T16:39:49.403 に答える