Yii 根据数据库表中的出生日期按年龄范围搜索用户

Yii 根据数据库表中的出生日期按年龄范围搜索用户,yii,Yii,现在,我有一个数据库表,它以“datetime”格式存储关于用户及其birhtdate的信息。此数据库表与相应的ActiveRecord模型关联 在用户搜索表单中,我希望实现按年龄范围搜索(使用两个表单下拉字段,分别为“from”和“to”年龄) 我认为在对数据库表执行搜索之前,我必须将通过表单提交的年龄转换为实际的“日期时间”日期 总体而言,我对CDb标准和Yii还没有足够的了解。这在社交网络中似乎很常见,但我还没有找到一个足够的答案来回答我的问题 我在等待答复时找到了一个解决办法。但我想我可

现在,我有一个数据库表,它以“datetime”格式存储关于用户及其birhtdate的信息。此数据库表与相应的ActiveRecord模型关联

在用户搜索表单中,我希望实现按年龄范围搜索(使用两个表单下拉字段,分别为“from”和“to”年龄)

我认为在对数据库表执行搜索之前,我必须将通过表单提交的年龄转换为实际的“日期时间”日期

总体而言,我对CDb标准和Yii还没有足够的了解。这在社交网络中似乎很常见,但我还没有找到一个足够的答案来回答我的问题

我在等待答复时找到了一个解决办法。但我想我可能没有直截了当地思考,所以我可能想出了一些不太合理的想法。但它是有效的

我在用户模型中创建了两个变量:

        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>
  • 我在模型的search()函数中稍微修改了CDbCriteria的实例,添加了以下行:

//指定应在其中搜索用户的年龄范围
//如果任一年龄字段(“至”或“自”年龄)未填写,则应用默认年龄
//默认年龄范围为10到110岁。
$criteria->addBetweenCondition('birthdate',$this->getBirthdate($this->toBirthdate,110),$this->getBirthdate($this->fromBirthdate,10));

总而言之,当用户通过搜索表单提交年龄范围时,它会作为整数存储在这两个变量中。然后,它们会被包含日期时间戳的字符串覆盖,这些日期时间戳是从提交的年龄转换而来的


我不得不在游戏中引入所谓的“默认最小年龄和最大年龄值”,以防用户在搜索时没有指定最小年龄和最大年龄。我不确定这是有史以来最明智的想法,但它对我来说很好。

我建议为此使用参数化命名范围:

将以下方法添加到模型中,确保将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();
我用我自己的数据测试了这一点,它成功了,但是如果你在使用你的数据时遇到困难,请告诉我

    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;
    }
$model = new User;
$to = 12;
$from = 25;
// Set other model attributes based on user input
$dataProvider = $model->byAge($to, $from)->search();