2016-09-09 27 views
0

使用Yii2过滤一个外键字段

我有一个名为'calificacion'的表,它有一个外键“alumno-id”,指向表中的字段标识。

在GridView插件定义的列是:

 [ 
      'header' => 'Alumno', 
      'attribute' => 'alumno.id', 
      'value' => 'alumno.name' 
     ], 

而且它表示完美,但所述过滤器,在列的标题,没有出现。我想有一个文本框用于编写校友名称并进行过滤。我怎样才能做到这一点?

编辑:我这里还有文件https://dl.dropboxusercontent.com/u/7059378/Desktop.zip

回答

0

您必须首先定义该表“calificacion”的模式的关系,像

public function getAlumno() 
{ 
    return $this->hasOne(Alumno::className(), ['id' => 'alumno_id']); 
} 

比Calificacion的搜索模式设置您在验证后加入表格,如

$query->joinWith('alumno');

高于设定的搜索像

$query->andFilterWhere([ 
    'alumno.id' => $this.alumno_id 
]); 
+0

这样做了,可以看到索引表上的字段,但不能搜索!我用文件编辑了这篇文章。 –

1

首先在你的SearchModel声明的属性。

public $alumno_name; 

在搜索模型添加规则:

[['alumno_name'], 'safe'], 

加入与搜索方法alumno关系(supponsinbly有一个在您Calificacion模型alumno关系):

$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' 
], 

你可以找到更多信息herehere

而不是header使用'label' => 'Alumno'

+0

你不需要添加一个虚假的属性:http://www.yiiframework.com/doc-2.0/guide-output-data-widgets.html#working-with-model-relations – soju

+0

哦,很好。我没有注意到这一点。谢谢! –

+0

这样做了,可以看到索引表上的字段,但不能搜索!我用文件编辑了这篇文章。 –