2011-01-25 62 views
2

我想创建一个前端模块上的搜索过滤器,将通过2场,这是几个月甚至几年Symfony的 - 每月搜索表,今年的日期时间字段

我有我的数据库表中的项目筛选,有一个日期时间字段。

我希望能够创建一个搜索,在那里如果我从2个下拉菜单,然后有样日期时间的所有项目选择2010年1:

2010-01-24 10:50: 52

2010-01-25 10时50分52秒

将上市

我使用的symfony 1.4,推进ORM

谢谢

回答

2

你为什么不尝试创建2日期和检查,如果该日期是他们之间,例如(2010-01-01> = $日期& & 2010-01-31 < = $日期)。如果是这样,那么你的范围和所有巧合将出现。

如果你绝对要检查月份和年份,我建议使用YEAR(日期)= $ yourDate和Month(日期)= $ 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

我同意。还有其他方法可以执行此操作,但这应该是最有效的。请提供用户的月份和年份。计算每月00:00:00的月份的第一天以及每个月的最后一天23:59:59。这将允许非常有效的搜索。像MONTH,YEAR等数据库转换是耗费资源并且经常绕过索引。 – Jestep 2011-01-25 23:22:36

0

我有在应用程序非常类似的链接。我使用的是sfFormExtraPlugin花式日期控件。

我的模式是“投诉”和我的动作是“探索”。

LIB /形式/ 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> 

应用/前端/模块/投诉/动作/的actions.class.php: 公共函数executeExplore($请求) { //默认:这个月的第一天 - 周

$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 /模型/教义/ 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; 
} 

现在,我使用的原则,所以你必须做一些翻译成Propelese模型中的一部分,你可能不会做“统计按月细分”的事情我在这里做,但应该帮助你走了。祝你好运!

相关问题