使用Yii2。
我有一个名为'calificacion'的表,它有一个外键'alumno-id',指向表alumno中的字段id。
GridView小部件中定义的列是:
[
'header' => 'Alumno',
'attribute' => 'alumno.id',
'value' => 'alumno.name'
],
它显示完美,但是列标题中的过滤器没有出现。我想要一个用于写出校友名称的文本框并进行过滤。我怎样才能做到这一点?
编辑:这是文件https://dl.dropboxusercontent.com/u/7059378/Desktop.zip
答案 0 :(得分:1)
首先在SearchModel
中声明一个属性。
public $alumno_name;
在搜索模型的规则中添加:
[['alumno_name'], 'safe'],
在搜索方法中加入alumno
关系(假设您的alumno
模型中存在Calificacion
关系):
$query = Calificacion::find()
->joinWith(['alumno alumno']);
使用$alumno_name
添加:
$dataProvider->sort = [
'attributes' => [
//Other attributes here
'alumno_name' => [
'asc' => ['alumno.name' => SORT_ASC],
'desc' => ['alumno.name' => SORT_DESC],
],
]
];
要过滤此内容,您必须添加:
$query->andFilterWhere(['like', 'alumno.name', $this->alumno_name]);
最后在您的网格视图中添加:
[
'attribute' => 'alumno_name',
'value' => 'alumno.name'
],
而不是header
使用'label' => 'Alumno'
。
答案 1 :(得分:0)
您必须首先在该表'calificacion'的模型中定义关系,例如
public function getAlumno()
{
return $this->hasOne(Alumno::className(), ['id' => 'alumno_id']);
}
在Calificacion的搜索模型中设置您在验证后加入表格,例如
$query->joinWith('alumno')
;
比设置搜索
$query->andFilterWhere([
'alumno.id' => $this.alumno_id
]);