有人可以帮助我了解如何使用日期范围(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(); ?>
答案 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中实现您正在做的事情。