如何自定义Yii2网格视图搜索模型字段



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

我使用的表/模型用于抽奖结果,其中包含idreset_at(日期时间(和winner_id,后者是用户表的外键。该模型还有一种方法,可以通过连接表获取所有进入抽奖的用户。

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

我试图通过改变规则方法来调整搜索模型,比如:

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

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

我没有在网格视图中使用id列。然后,我尝试将winner_id作为字符串读取,通过与字符串相等的用户名查找用户,并在过滤中使用它的id,如下所示:

// grid filtering conditions
$query->andFilterWhere([
'id' => $this->id,
'reset_at' => $this->reset_at,
'winner_id' => $winner->id,
]);

我也尝试过对日期字符串进行类似的处理,将过滤器调整为介于等之间的日期时间。然而,当我这样做时,搜索字段会从列的顶部消失。

如何自定义这些结果,甚至将完全自定义的属性添加到网格视图中进行自定义筛选?

更新:根据要求,这里是我的搜索模型(根据本指南更改代码(

<?php
namespace backendmodels;
use yiibaseModel;
use yiidataActiveDataProvider;
use commonmodelsRaffle;
/**
* RaffleSearch represents the model behind the search form of `commonmodelsRaffle`.
*/
class RaffleSearch extends Raffle
{
public $winner;
/**
* {@inheritdoc}
*/
public function rules()
{
return [
[['id', 'winner_id'], 'integer'],
[['reset_at', 'winner'], 'safe'],
];
}
/**
* {@inheritdoc}
*/
public function scenarios()
{
// bypass scenarios() implementation in the parent class
return Model::scenarios();
}
/**
* Creates data provider instance with search query applied
*
* @param array $params
*
* @return ActiveDataProvider
*/
public function search($params)
{
$query = Raffle::find();
// add conditions that should always apply here
$dataProvider = new ActiveDataProvider([
'query' => $query,
]);

$dataProvider->sort->attributes['winner'] = [
'asc' => ['app_user.username' => SORT_ASC],
'desc' => ['app_user.username' => SORT_DESC],
];
$this->load($params);
if (!$this->validate()) {
// uncomment the following line if you do not want to return any records when validation fails
return $dataProvider;
}
// grid filtering conditions
$query->andFilterWhere([
'id' => $this->id,
'reset_at' => $this->reset_at,
'winner_id' => $this->winner_id,
])
->andFilterWhere(['like', 'app_user.username', $this->winner]);
return $dataProvider;
}
}

试试这个:

在查询中添加联接表:

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]);

作为其他选项的示例,也可以检查以下答案:在yii2 中的两个日期之间搜索

最新更新