может ли кто-нибудь опубликовать, как фильтровать столбец временной метки сетки (Ymd h: m: s), используя выбор даты. моя модель ниже
public function search() { $criteria=new CDbCriteria(); $criteria->condition="time_up BETWEEN UNIX_TIMESTAMP('$this->time_up_from') AND UNIX_TIMESTAMP('$this->time_up_to')"; $criteria->compare('proc_id',$this->proc_id); $criteria->compare('book_id',$this->book_id); $criteria->compare('Project_name', $this->Project_name); $criteria->compare('isbn_no', $this->isbn_no); $criteria->compare('book_title',$this->book_title); $criteria->compare('totalpage',$this->totalpage,true); $criteria->compare('totaltime',$this->totaltime,true); return new CActiveDataProvider($this, array( 'criteria'=>$criteria, 'pagination'=>array( 'pageSize'=>100 ), )); }
для нормального конкретного условия его работа по нижнему условию
$criteria->condition = " time_up LIKE '$this->time_up%'";
для диапазона дат его не работает, я пробовал также wiki / 142 / на сайте yii, но не использовал. любезную помощь в этом. Или дайте некоторые другие методы для поиска результатов поиска по времени.
Мои данные из расширенной формы поиска
<div class=" wide form"> <?php $form=$this->beginWidget('CActiveForm', array( 'action'=>Yii::app()->createUrl($this->route), 'method'=>'get', )); ?> <div class="row"> <?php echo "Time UP from"; ?> <?php $this->widget('zii.widgets.jui.CJuiDatePicker', array( 'model'=>$model, 'name'=>'Process[time_up_from]', // Model attribute filed which hold user input 'options'=>array( 'showAnim'=>'fold', 'dateFormat'=>'yy-mm-dd',), 'htmlOptions'=>array( 'style'=>'height:20px;width:100px', 'size'=>15, //'value'=>date('Ym-d'), /*'onchange'=>"$.fn.yiiGridView.update('books-grid', {data: $(this).serialize()});" */),));?> </div> <?php echo "Time Up to"; ?> <?php $this->widget('zii.widgets.jui.CJuiDatePicker', array( 'model'=>$model, 'name'=>'Process[time_up_to]', // Model attribute filed which hold user input 'options'=>array( 'showAnim'=>'fold', 'dateFormat'=>'yy-mm-dd',), 'htmlOptions'=>array( 'style'=>'height:20px;width:100px', 'size'=>15, //'value'=>date('Ym-d'), /*'onchange'=>"$.fn.yiiGridView.update('books-grid', {data: $(this).serialize()});"*/ ),));?> </div> <?php echo CHtml::submitButton('Search'); ?>
ОТВЕТ НА ПРОБЛЕМУ
hi я нашел ответ на его просто условие if до условия критерия
`if(strlen($this->time_up_from) && strlen($this->time_up_to)) { $criteria->condition="time_up BETWEEN UNIX_TIMESTAMP('$this->time_up_from') AND UNIX_TIMESTAMP('$this->time_up_to')"; }
теперь его рабочий штраф. @ bool.dev Огромное спасибо за ваши предложения.
Попробуй это:
public function search(){ $criteria=new CDbCriteria(); if(!empty($this->time_up_from) && !empty($this->time_up_to)){ $criteria->condition="time_up BETWEEN UNIX_TIMESTAMP('$this->time_up_from') AND UNIX_TIMESTAMP('$this->time_up_to')"; } $criteria->compare('proc_id',$this->proc_id); $criteria->compare('book_id',$this->book_id); $criteria->compare('Project_name', $this->Project_name); $criteria->compare('isbn_no', $this->isbn_no); $criteria->compare('book_title',$this->book_title); $criteria->compare('totalpage',$this->totalpage,true); $criteria->compare('totaltime',$this->totaltime,true); return new CActiveDataProvider($this, array( 'criteria'=>$criteria, 'pagination'=>array( 'pageSize'=>100 ), )); }
time_up_to
что time_up_to
и time_up_from
являются виртуальными атрибутами, которые вы заявили в своей модели, time_up_from
за тем, чтобы вы их правильно объявили, а также добавили для них безопасный валидатор, например:
// in your model public $time_up_from; public $time_up_to; // in the rules of the model return array( // other rules // below is the safe rule array('proc_id, book_id, Project_name, isbn_no, book_title, totalpage, totaltime, time_up, time_up_from, time_up_to', 'safe', 'on'=>'search'), );
Также в вашей форме поиска измените выбор даты, как я уже упомянул в комментариях:
// remove the 'name'=>'Process[time_up_from]' and use the following line 'attribute'=>'time_up_from' // and remove the 'name'=>'Process[time_up_to]' and use the following line 'attribute'=>'time_up_to'
Как указал Dcoder в приведенных ниже комментариях, мы всегда должны связывать параметры, предотвращать инъекцию sql и, возможно, повышать производительность, поэтому измененное условие может быть:
if(!empty($this->time_up_from) && !empty($this->time_up_to)){ $criteria->condition="time_up BETWEEN UNIX_TIMESTAMP(:time_up_from) AND UNIX_TIMESTAMP(:time_up_to)"; $criteria->params[':time_up_from']=$this->time_up_from; $criteria->parmas[':time_up_to']=$this->time_up_to; }
От гида
У меня есть поле с номером, и я использую .., чтобы указать диапазон в поле ввода. В модели я просто делаю:
// check for .. as a range selector if ( stripos( $this->AGE_IN_DAYS, '..') ) { $range = explode( '..', $this->AGE_IN_DAYS ); $criteria->compare('AGE_IN_DAYS','>='.$range[0]); $criteria->compare('AGE_IN_DAYS','<='.$range[1]); } else { $criteria->compare('AGE_IN_DAYS',$this->AGE_IN_DAYS); }
простой и в моем выборе довольно логичный для пользователя. Он поставил 0..100 для выбора диапазона от 0 до 100. Дополнительного поля не требуется.