Symfony - поиск таблицы по месяцам, годам для полей даты и времени - PullRequest
2 голосов
/ 25 января 2011

Я пытаюсь создать поисковый фильтр в модуле внешнего интерфейса, который будет фильтровать по 2 полям, по месяцам и годам

У меня есть элементы в моей таблице базы данных, в которых есть поле даты и времени.

Я хотел бы иметь возможность создать поиск, где Если я выберу январь и 2010 год из 2 выпадающих списков, то все элементы, имеющие дату и время, такие как:

2010-01-24 10: 50: 52

2010-01-25 10: 50: 52

Будет в списке

Я использую Symfony 1.4 и Propel ORM

Спасибо

Ответы [ 2 ]

2 голосов
/ 25 января 2011

Почему бы вам не попробовать создать дату 2 и проверить, находится ли эта дата между ними, например (2010-01-01> = $ date && 2010-01-31 <= $ date). Если это так, то появится ваш радиус действия и все совпадения. </p>

Если вам абсолютно необходимо проверить месяц и год, я рекомендую использовать такие функции, как YEAR (дата) = $ yourDate и Month (date) = $ yourMonth, эти функции должны соответствовать критериям CUSTOM и выглядеть следующим образом: *

$criterias->addCriteria(TablePeer::DATE_ATTRIBUTE,"YEAR(". TablePeer::DATE_ATTRIBUTE .") = $year",Criteria::CUSTOM);
$criterias->addCriteria(TablePeer::DATE_ATTRIBUTE,"MONTH(". TablePeer::DATE_ATTRIBUTE .") = $month",Criteria::CUSTOM);

Вот ссылка на MysqlDateFunctions

0 голосов
/ 25 января 2011

У меня есть нечто очень похожее в приложении. Я использую sfFormExtraPlugin для модных виджетов даты.

Моя модель "Жалоба", а мое действие - "Исследовать".

Библиотека / форма / ExploreForm.php

class ExploreForm extends BaseForm
{
  public function configure()
  {

    $this->setWidgets
      (array(
             'explore_range' => new sfWidgetFormDateRange
             (array(
                    'from_date'   => new sfWidgetFormJQueryDate(),
                    'to_date'   =>  new sfWidgetFormJQueryDate(),
                    'label'   =>  'Date of Service ranging ',
                    )
              )
             )
       );

    $this->setValidators(array(
                               'explore_range'       => new sfValidatorDateRange
                               (array(
                                      'required' => true,
                                      'from_date' => new sfValidatorDate(array('required' => false)),
                                      'to_date' => new sfValidatorDate(array('required' => false))
                                      )),
                               'from'   =>  new sfValidatorPass(),
                               'to'   =>  new sfValidatorPass()
                               )
                         );

  }
}

приложений / интерфейс / модули / жалобы / шаблоны / exploreSuccess.php

<form action="<?php echo url_for('complaint/explore') ?>" method="GET">
  <input type="submit" value="Change date range" style="float:right" />
  <ul>
<?php echo $form->renderUsing('list')  ?>
  </ul>
</form>

В apps / frontend / modules / жалобе / actions / actions.class.php : публичная функция executeExplore ($ запрос) { // по умолчанию: первый день этого месяца - 1 год

  $this->form = new ExploreForm(array(
                'explore_range'   =>  array (
                             'from'   =>  $a_year_ago,
                             'to'   =>  $last_of_last_month
                             )
                  ));

  if ($request->hasParameter('explore_range') ) {
$this->form->bind( array('explore_range' => $request->getParameter('explore_range')) );
$this->logMessage("bound", "debug");
if ($this->form->isValid()) {
  $this->form_values = $this->form->getValues(); # cleaned
  $this->logMessage("validation WIN", "debug");
}
else {
  $this->logMessage("validation FAIL", "debug");
  $this->form_values = $this->form->getDefaults();
}

  }
  else {
$this->logMessage("no explore_range param", "debug");
$this->form_values = $this->form->getDefaults();
  }

  $this->from = $this->form_values['explore_range']['from'];
  $this->to = $this->form_values['explore_range']['to'];


  /* complaints per month */
  $this->complaints_by_month = ComplaintTable::getMonthCounts($this->from, $this->to);


  // ...

}

И фактический запрос находится в модели, lib / model / doctrine / ComplaintTable.class.php :

public static function getMonthCounts($from, $to) {

  $connection = Doctrine_Manager::connection();
  $query = <<<ENDSQL
    SELECT year(`date`) as y, month(`date`) as m, count(*) as c
    FROM `complaints`.`complaint`
    WHERE `date` BETWEEN ? AND ?
    GROUP BY year(`date`), month(`date`)
ENDSQL;

  $statement = $connection->execute($query, array($from, $to));

  $result = array();
  while ($row = $statement->fetch()) {
    $result[ sprintf("%04d-%02d",$row[0], $row[1]) ] = $row[2];
  }

  return self::addZeroRows($result, $from, $to);
}

public static function addZeroRows($set, $from, $to) {
  /* insert zero counts for months with no count */
  $from_fields = date_parse($from);
  $to_fields = date_parse($to);
  $start_y = $from_fields['year'];
  $end_y = $to_fields['year'];
  $start_m = $from_fields['month'];
  $end_m = $to_fields['month'];

  $i = 0;
  for ( $y = $start_y;  $y <= $end_y;  $y++ ) {
    for (   $m = ($y == $start_y ? $start_m : 1) ;
            ($y == $end_y && $m <= $end_m) || ($y < $end_y && $m <= 12);
            $m++
            ) {
      $y_m = sprintf("%04d-%02d",$y,$m);
      if ( !isset( $set[$y_m] ) ) {
        $set[$y_m] = 0;
      }
      if ($i++ > 100) {  // don't infinitely loop... you did it wrong
        return $set;
      }
    }
  }


  ksort($set);
  return $set;
}

Теперь я использую Doctrine, поэтому вам придется немного перевести на Propelese в части модели, и вы, возможно, не будете делать то, что я делаю здесь, «статистика с разбивкой по месяцам», но это должно помочь вам начать. Удачи!

...