0

私は2つのmysql DATEフィールド「validFrom」と「validTo」を持つテーブルを持っています。

ユーザーがvalidFromとvalidToの間の期間を検索できるようにする必要があります(含まれています)

を使用して検索

  • validFrom >= 検索された validFrom および
  • validTo <= 検索された validTo

何を変更する必要がありますか? 検索() ?.

Gii が作成したコードは、これを教えてくれます (「LIKE %string%」検索だと思います)。

$criteria->compare('validFromDate',$this->validFromDate,true);
$criteria->compare('validToDate',$this->validToDate,true);
4

3 に答える 3

2
$criteria->addBetweenCondition('colName', $this->validFrom, $this->validTo);
于 2012-10-18T07:16:46.750 に答える
1
public function search() {
        // Warning: Please modify the following code to remove attributes that
        // should not be searched.

        $criteria = new CDbCriteria;
        $criteria->with = array('user');

        $criteria->compare('nota_id', $this->nota_id, true);
        $criteria->compare('user.nume', $this->filter_nume, true);
        $criteria->compare('persoana1', $this->persoana1, true);
        $criteria->compare('persoana2', $this->persoana2, true);

        $d = $this->getFilterDateRange($this->data_discutie);
        if (!empty($d[0]) && !empty($d[1])) {
            // between condition
            $criteria->addBetweenCondition('data_discutie', $d[0], $d[1]);
        } else if (!empty($d[0])) {
            $criteria->compare('data_discutie', '>=' . $d[0]);
        } else if (!empty($d[1])) {
            $criteria->compare('data_discutie', '<=' . $d[1]);
        }

        $d = null;
        //echo $this->urmatoarea_discutie;
        $d = $this->getFilterDateRange($this->urmatoarea_discutie);
        //print_R($d);
        if (!empty($d[0]) && !empty($d[1])) {
            // between condition
            $criteria->addBetweenCondition('urmatoarea_discutie', $d[0], $d[1]);
        } else if (!empty($d[0])) {
            $criteria->compare('urmatoarea_discutie', '>=' . $d[0]);
        } else if (!empty($d[1])) {
            $criteria->compare('urmatoarea_discutie', '<=' . $d[1]);
        }

        return new CActiveDataProvider($this, array(
                    'criteria' => $criteria,
                    'pagination' => array(
                        'pageSize' => '15',
                    ),
                    'sort' => array(
                        'defaultOrder' => 'coalesce(nullif(t.urmatoarea_discutie, ""), \'zzzzzz\') ASC, t.data_discutie ASC',
                        'attributes' => array(
                            'urmatoarea_discutie',
                            'data_discutie',
                            'persoana2',
                            'persoana1',
                            'filter_nume' => array(
                                'asc' => 'user.nume asc',
                                'desc' => 'user.nume desc'
                            ),
                        ),
                    ),
                ));
    }

    protected function getFilterDateRange($key) {
        $ret = array(&$from, &$to);
        switch ($key) {
            case '-1':
                // past
                $to = strtotime('next hour');
                break;
            case '1':
                // future
                $from = strtotime('last hour');
                break;
            case '-7':
                $from = strtotime('-1 week last monday midnight');
                $to = strtotime('last sunday midnight');
                break;
            case '7':
                $from = strtotime('last monday');
                $to = strtotime('next sunday midnight');
                break;
        }
        return $ret;
    }
于 2012-10-18T08:30:29.853 に答える
0

やりたいことによっては、モデル内の search() が必ずしも探したい場所であるとは限りません。以下は、標準的な Yii クエリです。

$model = WhateverModel::model()->findAll(array(
    "condition" => "'.date('Y-m-d H:i:s' BETWEEN validRrom AND validTo).'",
));

より詳細なヘルプがあれば、もう少し詳しく説明する必要があります:)

于 2012-10-18T07:32:16.127 に答える