如何使搜索过滤器与 Yii2 中的格式化日期一起使用?

How to make search filters work with formatted dates in Yii2?

$query->andFilterWhere(['like', 'date_of_birth', date('d-m-Y',strtotime($this->date_of_birth))]);

没用..

¿您在使用 MySQL 吗?则日期格式为:YYYY-MM-DD。这就是 MySQL 的工作方式,您无法更改它。

您可以在您的网站和表单上以您想要的格式显示日期,但您必须将其传递给 MYSQL,因为 MYSQL 期望收到它。所以你应该做的是:

在你的模型中 class:

public function beforeSave($insert) {

    /* for example if my form date format is: dd-mm-yyyy 
    You must change it for yyyy-mm-dd before saving into DDBB */

    if (!empty($this->date_of_birth )) {
        $this->date_of_birth = Yii::$app->formatter->asDate($this->date_of_birth, 'php:Y-m-d');
    }

    return parent::beforeSave($insert);

}  

查看文档以获取更多信息:

https://www.yiiframework.com/doc/api/2.0/yii-db-baseactiverecord#beforeSave()-detail

为了在您的表单和视图中再次显示此日期:

<?php    
    $model->date_of_birth = !empty($model->date_of_birth) ? Yii::$app->formatter->asDate($model->date_of_birth, 'php:d-m-Y') : null;    
?>

更新:

要使过滤器在(例如)格式化日期时在 gridview 中工作,您应该修改 YourModelSearch.php 模型中的比较 class:

来自这里:

$query->andFilterWhere(['date_of_birth' => $this->date_of_birth]);

为此:

/* Change the format to MySQL Date Format when compares */
$query->andFilterWhere(['date_of_birth' => Yii::$app->formatter->asDate($this->date_of_birth, 'php:Y-m-d')]);

在你的 config/web.php 你应该有这样的东西:

'components' => [
    ...
    'formatter' => [
        'class' => 'yii\i18n\Formatter',
        'timeZone' => 'Europe/London',
        'defaultTimeZone' => 'Europe/London',
        'dateFormat' => 'd/M/Y',
        'datetimeFormat' => 'd/M/Y H:m',
        'timeFormat' => 'H:m:s',
        'decimalSeparator' => ',',
        'thousandSeparator' => '',
        'currencyCode' => 'EUR',
        'locale'=>'es_ES'
    ],
    ...
]

永远不要对 Date 类型使用 LIKE 比较器。