有人可以帮助我如何使用日期范围(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(); ?>
你的代码:
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;
对于MySQL中的日期范围,您应该使用BETWEEN函数。
$criteria->condition= "create_date between '$this->from_date' and '$this->to_date'"
如果没有设置任何内容,您应该设置默认值from_date和to_date,这样您就可以随时使用一个条件。
在您的标准中,您使用$criteria->compare('satisfy_val',$this->satisfy_val,true);
虽然这从未作为表格的输入处理?我会先尝试根据日期获取数据,并确保部分标准正常运行。
另外,你通常会通过CGridView小部件在Yii中实现你正在做的事情。