如何自定义Yi2 Gridview搜索模型字段

如何自定义Yi2 Gridview搜索模型字段,gridview,yii2,Gridview,Yii2,我使用Gii生成CRUD模型、视图和控制器 我使用的表/模型用于抽奖结果,其中包含一个id、一个reset\u at(datetime)和一个winner\u id,它是用户表的外键。该模型还提供了一种方法,可通过连接表获取所有参与抽奖的用户 我使用的是Kartik的gridview,我希望在字段中的reset\u是一个日期选择器,而winner\u id则是winner的用户名。我已经很容易地设置了表格行,以显示格式化的日期和获胜者的用户名。问题是顶部的搜索字段仍然是datetime(字符串)

我使用Gii生成CRUD模型、视图和控制器

我使用的表/模型用于抽奖结果,其中包含一个
id
、一个
reset\u at
(datetime)和一个
winner\u id
,它是用户表的外键。该模型还提供了一种方法,可通过连接表获取所有参与抽奖的用户

我使用的是Kartik的gridview,我希望在字段中的reset\u是一个日期选择器,而winner\u id则是winner的用户名。我已经很容易地设置了表格行,以显示格式化的日期和获胜者的用户名。问题是顶部的搜索字段仍然是
datetime
(字符串)和
winner\u id
(整数)

我尝试通过更改规则方法来调整搜索模型,例如:

return [
    [['id', 'winner_id'], 'integer'],
    [['reset_at'], 'safe'],
];

我没有在gridview中使用
id
列。然后我尝试将
winner\u id
作为字符串读取,通过用户名查找用户,使其等于字符串,并在筛选中使用其id,如下所示:

// grid filtering conditions
$query->andFilterWhere([
    'id' => $this->id,
    'reset_at' => $this->reset_at,
    'winner_id' => $winner->id,
]);
我也尝试过类似的日期字符串,我将过滤器调整为介于之间的日期时间,等等。但是当我这样做时,搜索字段从列的顶部消失

如何自定义这些结果,或者甚至向gridview添加完全自定义的属性以进行自定义筛选

更新: 根据要求,这里是我的搜索模型(代码更改如下)

试试这个:

将联接表添加到查询中:

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

        $query->joinWith(['USER_TABLE_RELATION_NAME']); //Change to you relation name
        ...
        $query->andFilterWhere(['like', 'USER_TABLE.name', $this->winner]);
        ...
不幸的是,我计划使用中间值,但我对yii的查询非常生疏。我不知道如何在活动查询中使用它

要在日期之间搜索,可以使用以下方法:

$query->andFilterWhere(['BETWEEN', 'YOUR_DATE_TABLE_FIELD', $this->start_date, $this->end_date]);

作为其他选项的示例,请检查以下答案:

这将帮助您获得所需的结果:@SergheiLeonenco我看到了,这似乎对我没有帮助,因为我最终得到的是从不在查询中的表中选择的错误查询。你能发布你的整个搜索方法吗?@SergheileOnneco发布了整个模型,在初始查询旁边包括这个
$query=Raffle::find()下一行此
$query->joinWith(['USER\u TABLE\u relationship\u NAME')
public function search($params)
    {
        $query = Raffle::find();

        $query->joinWith(['USER_TABLE_RELATION_NAME']); //Change to you relation name
        ...
        $query->andFilterWhere(['like', 'USER_TABLE.name', $this->winner]);
        ...
$query->andFilterWhere(['BETWEEN', 'YOUR_DATE_TABLE_FIELD', $this->start_date, $this->end_date]);