[英]Yii - incorrect returned date range using CJuiDatePicker
下午好
我的視圖中有一個日期選擇器,用於選擇開始日期和結束日期。 我的問題是我無法在所選日期范圍內獲取正確的數據。 我在下面有一個示例圖像,向您展示我的意思。
樣本數據:
如果我選擇開始日期(2015-10-01),然后選擇結束日期(2015-10-29),則僅返回此值。
代替這個
我只有兩個日期,分別是從中選擇的日期和從中選擇的日期。.問題是它應該返回候選1、2和3,因為它們的日期在start_date(2015-10-01)到end_date(2015- 10-29)。 我的代碼有什么問題。 請幫忙。 有人可以查看我的代碼嗎。也許我錯過了一些東西。
這是我的看法。
<form>
<div class="form-group"><label>Date From</label>
<?php
$this->widget('zii.widgets.jui.CJuiDatePicker', array(
'model' => $model,
'name' => 'start_date',
'options'=>array(
'dateFormat'=>'yy-mm-dd',
),
'htmlOptions'=>array(
'class'=>'form-control',
'placeholder'=>'From',
'value' => $search_date_start,
),
));
?>
</div>
<div class="form-group"><label>To</label>
<div class="controls" style='margin-top: 5px;'>
<?php
$end_date = date('m-d-Y');
$this->widget('zii.widgets.jui.CJuiDatePicker', array(
'model' => $model,
'name' => 'end_date',
'options'=>array(
'dateFormat'=>'yy-mm-dd',
),
'htmlOptions'=>array(
'class'=>'form-control',
'placeholder'=>'To',
'value' => $search_date_end,
),
));
?>
</div>
</div>
</div>
<div class="form-group">
<input type="submit" name='search_btn' value="Search" class='btn btn-primary '>
<input type="submit" name='reset_btn' value="Reset" class='btn btn-default '>
</div>
</form>
在我的控制器中,我添加了此代碼。
if(isset($_POST['search_btn'])) {
if (isset($_POST['start_date']) && isset($_POST['end_date'])) {
$search_date_start = $_POST['start_date'];
$search_date_end = $_POST['end_date'];
Yii::app()->session['start_date_evaluation'] = $search_date_start;
Yii::app()->session['end_date_evaluation'] = $search_date_end;
}
if (isset($_POST['search'])) {
$search = $_POST['search'];
Yii::app()->session['search_evaluation'] = $search;
}
}
在我的模型中,我有此代碼。
public function search($candidate_id, $search_date_start, $search_date_end, $search) {
// Warning: Please modify the following code to remove attributes that
// should not be searched.
$criteria = new CDbCriteria;
$criteria->compare('id', $this->id);
$criteria->compare('evaluation_form_id', $this->evaluation_form_id);
$criteria->addSearchCondition('evaluatee', $search);
$criteria->addSearchCondition('start_date', $search_date_start);
$criteria->addSearchCondition('end_date', $search_date_end);
if ($candidate_id !== '') {
$criteria->compare('employee_id', $candidate_id);
} else {
$criteria->compare('employee_id', $this->employee_id);
$criteria->compare('evaluation_code', $this->evaluation_code);
$criteria->compare('start_date', $this->start_date, true);
$criteria->compare('end_date', $this->end_date, true);
$criteria->compare('evaluatee', $this->evaluatee, true);
$criteria->compare('date_created', $this->date_created, true);
$criteria->compare('created_by', $this->created_by, true);
}
if ($search_date_end !== '' && $search_date_start !== ''){
$criteria->compare('start_date', $search_date_start, false, '>=');
$criteria->compare('end_date', $search_date_end, false, '<=');
}
return new CActiveDataProvider($this, array(
'criteria' => $criteria,
));
}
您將3個帶有start_date的條件添加到模型的搜索方法中:
$criteria->addSearchCondition('start_date', $search_date_start);
$criteria->compare('start_date', $this->start_date, true);
$criteria->compare('start_date', $search_date_start, false, '>=');
想象一下,WHERE之后的sql如下所示:
WHERE
start_date='2015-10-01'
AND start_date LIKE '%2015-10-01%'
AND start_date>='2015-10-01'
最后兩個條件變得毫無用處。 因此,您只需要保留一個條件。
PS激活main.php中的跟蹤日志以查找您的SQL查詢以進行調試:
'routes' => array(
array(
'class' => 'CFileLogRoute',
'logFile' => 'application_trace.log',
'levels' => 'trace',
'rotateByCopy' => true,
'enabled' => true,
)
)
嘗試這個:
if ($search_date_end !== '' && $search_date_start !== ''){
$criteria->addBetweenCondition('DATE_FORMAT(start_date,"%Y-%m-%d")',
date("Y-m-d", strtotime($search_date_start)),
date("Y-m-d", strtotime($search_date_end)), 'AND');
$criteria->addBetweenCondition('DATE_FORMAT(end_date,"%Y-%m-%d")',
date("Y-m-d", strtotime($search_date_start)),
date("Y-m-d", strtotime($search_date_end)), 'AND');
}
我就知道。 我知道我的狀況有些缺失。
if ($search_date_end !== '' && $search_date_start !== ''){
$criteria->compare('start_date', $search_date_start, false, '>=');
$criteria->compare('end_date', $search_date_end, false, '<=');
}
在這種情況下,只有start_date和end_date被驗證。 這就是為什么它將僅返回兩個日期的原因。 從和到。
這就是我所做的。 這驗證了一切。
if ($search_date_end == '' && $search_date_start !== '') {
$criteria->condition = "start_date >= '$search_date_start'";
} elseif ($search_date_end !== '' && $search_date_start == '') {
$criteria->condition = "end_date <= '$search_date_end'";
} elseif ($search_date_end !== '' && $search_date_start !== '') {
$criteria->condition = "start_date >= '$search_date_start' AND end_date <= '$search_date_end'";
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.