DatePicker小部件过滤日期时间字段

问题描述 投票:0回答:1

朋友们,我如何获得下面的DatePicker组件(在Yii2 Framewok中),过滤datetime类型的字段?因为在组件中我只能指定date格式。

_search.php文件:

<?php

    echo DatePicker::widget([
        'model' => $model,
        'attribute' => 'start_date',
        'attribute2' => 'end_date',
        'language' => 'pt',
        'type' => DatePicker::TYPE_RANGE,
        'separator' => 'até',
        'options' => [
            'placeholder' => '',
        ],
        'pluginOptions' => [
            'autoclose'=>true,
            'todayHighlight' => true,
            'format' => 'yyyy-mm-dd',
        ]
    ]);
?>

UPDATE

public function search($params)
    {
        $query = Report::find();

        $dataProvider = new ActiveDataProvider([
            'query' => $query,
            'sort' => [
            'defaultOrder' => [
                'created' => SORT_DESC, 
                ]
            ],
            'pagination' => [
                'pageSize' => 100,
                ],
        ]);

        $this->load($params);

        if (!$this->validate()) {
            return $dataProvider;
        }

        $query->andFilterWhere([
            'id' => $this->id,
            'created' => $this->created,
            'updated' => $this->updated,
            'closed' => $this->closed,
            'user_id' => $this->user_id,
            'status_id' => $this->status_id,
            'location_id' => $this->location_id,
            'typeperson_id' => $this->typeperson_id,
            'field_cpfcnpj' => $this->field_cpfcnpj,
        ]);

        $query->andFilterWhere(['between', 'created', $this->start_date, $this->end_date]);

        $query->andFilterWhere(['between', 'closed', $this->start_closed, $this->end_closed]);

        return $dataProvider;
    }
yii2
1个回答
1
投票

如果我理解正确,您希望使用日期范围提交表单,该日期范围应使用给定范围过滤记录。

看着你search()方法,看起来你在搜索模型中声明了2个公共属性/字段,名称为start_dateend_date,它们与DatePicker一起使用,你试图将范围与列created进行比较。

您需要执行以下操作才能正确过滤记录

确保以下内容

  • start_dateend_datesafe模型中被宣布为ReportSearch模型。
  • 您需要使用\yii\db\Expression将列中的日期转换为所需的格式,并使用php:date格式化给定的日期范围,即start_dateend_date

$dataProvider方法中返回search()之前添加以下内容

if ($this->start_date !== null && $this->end_date !== null) {
    $query->andFilterWhere(
        [
            'BETWEEN',
            new Expression(
               'DATE_FORMAT(created,"%Y/%m/%d")'
            ),
            date("Y/m/d", strtotime($this->start_date)),
            date("Y/m/d", strtotime($this->end_date)),
        ]
    );
}

注意:如果您将created列保存为timestamp,则需要使用FROM_UNIXTIME将字段名称包含在现有查询中,如下所示,否则如果列为DATEDATETIME,则上述操作将起作用。

Column type is of TIMESTAMP

if ($this->start_date !== null && $this->end_date !== null) {
    $query->andFilterWhere(
        [
            'BETWEEN',
            new Expression(
                    'DATE_FORMAT(FROM_UNIXTIME(created),"%Y/%m/%d")'
                ),
            date("Y/m/d", strtotime($this->start_date)),
            date("Y/m/d", strtotime($this->end_date)),
        ]
    );
}

您完整的search()方法如下所示

public function search($params)
{
    $query = Report::find();

    $dataProvider = new ActiveDataProvider([
        'query' => $query,
        'sort' => [
            'defaultOrder' => [
                'created' => SORT_DESC,
            ]
        ],
        'pagination' => [
            'pageSize' => 100,
        ],
    ]);

    $this->load($params);

    if (!$this->validate()) {
        return $dataProvider;
    }

    $query->andFilterWhere([
        'id' => $this->id,
        'created' => $this->created,
        'updated' => $this->updated,
        'closed' => $this->closed,
        'user_id' => $this->user_id,
        'status_id' => $this->status_id,
        'location_id' => $this->location_id,
        'typeperson_id' => $this->typeperson_id,
        'field_cpfcnpj' => $this->field_cpfcnpj,
    ]);

    if ($this->start_date !== null && $this->end_date !== null) {
        $query->andFilterWhere(
            [
                'BETWEEN',
                new Expression(
                    'DATE_FORMAT(created_at,"%Y/%m/%d")'
                ),
                date("Y/m/d", strtotime($this->start_date)),
                date("Y/m/d", strtotime($this->end_date)),
            ]
        );
    }

    $query->andFilterWhere(['between', 'closed', $this->start_closed, $this->end_closed]);

    return $dataProvider;
}
© www.soinside.com 2019 - 2024. All rights reserved.