按外键字段过滤

时间:2016-09-09 13:06:51

标签: yii yii2 yii2-advanced-app

使用Yii2。

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

GridView小部件中定义的列是:

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

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

编辑:这是文件https://dl.dropboxusercontent.com/u/7059378/Desktop.zip

2 个答案:

答案 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'
],

您可以找到更多信息herehere

而不是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
]);