0

これで、ユーザーに関する情報とその誕生日を「日時」形式で格納するデータベーステーブルができました。このデータベーステーブルは、それぞれのActiveRecordモデルと相関しています。

ユーザー検索フォームで、年齢範囲による検索を実装したいと思います(2つのフォームドロップダウンフィールド、それぞれ「from」と「to」age)。

データベーステーブルに対して検索を実行する前に、フォームを介して送信された年齢を実際の「日時」に変換する必要があると思います。

CDbCriteriaとYii全般についてはまだ十分に理解していません。ソーシャルネットワークでは当たり前のようですが、質問に対する十分な答えを見つけることができませんでした。

返事を待っている間に解決策を見つけました。しかし、私はまっすぐに考えていなかったかもしれないと思うので、おそらく私はかなり合理的ではない何かを思いついたでしょう。しかし、それは機能します。

ユーザーモデルに2つの変数を作成しました。

        public $fromBirthdate;
        public $toBirthdate;

検索フォームの検索フィールドを、単一の生年月日フィールドから、最小年齢と最大年齢をそれぞれ表す整数を保持するフィールド「to」と「from」に変更しました。

これらのフィールドを、モデルに新しく作成された変数に関連付けました。

<div class="row">
        <?php echo $form->label($model,'fromBirthdate'); ?>
        <?php echo $form->textField($model,'fromBirthdate'); ?>
    </div>

    <div class="row">
        <?php echo $form->label($model,'toBirthdate'); ?>
        <?php echo $form->textField($model,'toBirthdate'); ?>
    </div>

>>

次に、現在の時刻に基づいて年齢を誕生日に変換する関数を作成しました。

//transforms age into birthdate based on current date
//@param integer age
//@param integer default age (what age should be applied in case the age parameter is null)
//$returns string date formatted MySQL timestamp

public function getBirthdate($age, $defaultAge)
{
    if($age == null)
    $age = $defaultAge;

    $birthDate = date('Y-m-d H:i:s',strtotime("-" . $age . "years", time()));
    return $birthDate;
}
  • 次の行を追加して、モデルのsearch()関数でCDbCriteriaのインスタンスを少しいじりました。

 
//specifies range of age the users should be searched within
    //if either of the age fields ("to" or "from" age") was not filled, default age is applied
    //default age range is from 10 to 110 years old. 
    $criteria->addBetweenCondition('birthdate', $this->getBirthdate($this->toBirthdate, 110), $this->getBirthdate($this->fromBirthdate, 10));

全体として、ユーザーが検索フォームを介して年齢範囲を送信すると、これら2つの変数に整数として格納されます。次に、送信された年齢から変換された日時スタンプを含む文字列で上書きされます。

ユーザーが検索で最小年齢と最大年齢を指定しなかった場合に備えて、いわゆる「デフォルトの最小年齢と最大年齢の値」をプレイに導入する必要がありました。これがこれまでで最も賢明なアイデアであったかどうかはわかりませんが、私には問題なく機能します。

4

1 に答える 1

0

これにはパラメータ化された名前付きスコープを使用することをお勧めします: http://www.yiiframework.com/doc/guide/1.1/en/database.ar#named-scopes

次のメソッドをモデルに追加し、createtime を独自の datetime 列の名前に変更してください。

    public function byAge($to, $from)
    {
        $from = new DateTime("-$from years");
        $fromDate = $from->format('Y-m-d H:i:s');

        $to = new DateTime("-$to years");
        $toDate = $to->format('Y-m-d H:i:s');

        $this->getDbCriteria()->mergeWith(array(
            'condition' => 't.createtime BETWEEN :from AND :to',
            'params' => array(
                ':from' => $fromDate,
                ':to' => $toDate,
            ),
            'order' => 't.createtime DESC', // Youngest first
        ));

        return $this;
    }

フォームから $to と $from の値を取得します。ここで、$to は若い年齢、$from は古い年齢です。次に、メソッドを使用するには、次のようにして検索方法を変更します。

$model = new User;
$to = 12;
$from = 25;
// Set other model attributes based on user input
$dataProvider = $model->byAge($to, $from)->search();

私は自分のデータでこれをテストし、うまくいきましたが、あなたのデータでうまくいかない場合はお知らせください.

于 2013-03-04T12:52:20.253 に答える