按YII框架中的用户,位置和日期范围分组

时间:2015-03-07 09:38:56

标签: mysql web-applications yii grouping date-range

有人可以帮助我了解如何使用日期范围(create_date)并按user_id和位置对数据进行分组吗?

我输入字段user_id,location和daterange,排序结果恰好发生在日期范围内。 我多次尝试修复控制器,但结果仍然相同。

如果我只输入user_id字段并仅在user_id和位置上输入CGridView上的位置和日期范围字段排序,则日期范围保持随机顺序。

以下是模型,控制器和视图

模型 我在模型中的变量

 public $from_date;
 public $to_date;
      ....
 public function search()
        {
            $criteria=new CDbCriteria;


            $criteria->compare('user_id',$this->user_id);
            $criteria->compare('location',$this->location,true);
            $criteria->compare('satisfy_val',$this->satisfy_val,true);
            $criteria->compare('create_date',$this->create_date,true);
            /* $criteria->mergeWith($this->dateRangeSearchCriteria('create_date',$this->create_date
            )); */
            if(!empty($this->from_date) && empty($this->to_date)){
                $criteria->condition="create_date >= '$this->from_date'";
            }elseif(!empty($this->to_date) && empty($this->from_date)){
                $criteria->condition="create_date <= '$this->to_date'";
            }elseif(!empty($this->to_date) && !empty($this->from_date)){
                $criteria->condition="create_date >= '$this->from_date' and create_date<= '$this->to_date'";
            }

            return new CActiveDataProvider($this, array(
                'criteria'=>$criteria,
                'sort'=>array('defaultOrder'=>array('user_id DESC','create_date DESC')),
            ));
        }

这是我的控制器

public function actionAdmin()
    {
        $model=new Satisfact('search');
        /* $model->unsetAttributes();  // clear any default values */
        if(isset($_GET['Satisfact'])){
            /* $model->attributes=$_GET['Satisfact']; */
            $model->user_id=$_GET['Satisfact']['user_id'];
            $model->lokasi=$_GET['Satisfact']['location'];          
            $model->from_date=$_GET['Satisfact']['from_date'];
            $model->to_date=$_GET['Satisfact']['to_date'];

        }
            $this->render('admin',array(
            'model'=>$model,
        ));


    }
...............

和我的观点

<div class="wide form">

<?php $form=$this->beginWidget('CActiveForm', array(
    'action'=>Yii::app()->createUrl($this->route),
    'method'=>'get',
)); ?>



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

    <div class="row">
        <?php echo $form->labelEx($model,'user_id'); ?>
        <?php $_u = User::model()->findAll();
                  echo CHtml::activeDropDownList(
                        $model,'user_id',
                        CHtml::listData($_u,'id','username'),
                        array('prompt'=>'',) //empty is aliases FOR ALL user
                    );
               ?>
    </div>
    <div="row">
    <?php echo $form->labelEx($model,'location'); ?>
        <?php $lo_u = Location::model('Location')->findAll('id');
                  echo CHtml::activeDropDownList(
                        $model,'location',
                        CHtml::listData($lo_u,'location','location'),
                        array('prompt'=>'',)
                    );
               ?>
    </div>

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

    <div class="column">
        <?php echo $form->label($model,'create_date'); ?>
        <?php //echo $form->textField($model,'create_date'); ?>
        <?php 
        echo "From : ";
            $this->widget('zii.widgets.jui.CJuiDatePicker',
            array(
            'name'=>'Satisfact[from_date]',
            'options'=>array('dateFormat'=>'yy-mm-dd',),            

            ));
        echo " To : ";
            $this->widget('zii.widgets.jui.CJuiDatePicker',
            array(
            'name'=>'Satisfact[to_date]',
            'options'=>array('dateFormat'=>'yy-mm-dd',),            

            )); 


        ?>
    </div>

    <div class="column">
        <?php echo CHtml::submitButton('Search'); ?>
    </div>

<?php $this->endWidget(); ?>

2 个答案:

答案 0 :(得分:0)

您的密码:

if(!empty($this->from_date) && empty($this->to_date)){
                $criteria->condition="create_date >= '$this->from_date'";
            }elseif(!empty($this->to_date) && empty($this->from_date)){
                $criteria->condition="create_date <= '$this->to_date'";
            }elseif(!empty($this->to_date) && !empty($this->from_date)){
                $criteria->condition="create_date >= '$this->from_date' and create_date<= '$this->to_date'";
            }

在上面的代码中,$this->from_date是一个属性,你将它用作字符串,因为你在它周围加上逗号。

'$this->from_date'

上面的代码在您的代码中是错误的,因为您可以在其中看到逗号。
尝试

$criteria->condition="create_date >=". $this->from_date;

答案 1 :(得分:0)

对于MySQL中的日期范围,您应该使用BETWEEN函数。

 $criteria->condition= "create_date between '$this->from_date' and '$this->to_date'"

您应该设置from_date&amp;的默认值to_date如果没有设置,那么你总是可以选择一个条件。

根据您的条件,您使用$criteria->compare('satisfy_val',$this->satisfy_val,true); 虽然这从来没有作为表格的输入处理?我会先尝试根据日期获取数据,并确保部分标准正常运行。

另一方面,您通常会通过CGridView小部件在Yii中实现您正在做的事情。