Yii 按';这是外键

Yii 按';这是外键,yii,yii2,yii2-advanced-app,Yii,Yii2,Yii2 Advanced App,使用Yii2 我有一个名为“calificacion”的表,它有一个外键“alumno id”,指向表alumno中的字段id GridView小部件中定义的列为: [ 'header' => 'Alumno', 'attribute' => 'alumno.id', 'value' => 'alumno.name' ], 它显示得很完美,但是列标题中的过滤器没有出现。我想

使用Yii2

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

GridView小部件中定义的列为:

        [
            'header' => 'Alumno',
            'attribute' => 'alumno.id',
            'value' => 'alumno.name'
        ],
它显示得很完美,但是列标题中的过滤器没有出现。我想有一个文本框,用来写校友的名字,然后过滤掉。我怎样才能做到这一点


编辑:以下是文件

您必须首先在该表“calificacion”的模型中定义一个关系,如

public function getAlumno()
{
    return $this->hasOne(Alumno::className(), ['id' => 'alumno_id']);
}
在Calificacion的搜索模型中,您在验证后加入表,如

$query->joinWith('alumno')

而不是像搜索一样设置

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

首先在
SearchModel
中声明一个属性

public $alumno_name;
在搜索模型的规则中添加:

[['alumno_name'], 'safe'],
在搜索方法中加入
alumno
关系(支持您的
Calificacion
模型中存在
alumno
关系):

要使用
$alumno\u 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'
],
您可以找到更多信息和


另外,不要使用
标题
而使用
'label'=>'Alumno'

您不需要添加假属性:哦,很好。我没有注意到。谢谢这样做,可以看到索引表上的字段,但无法搜索!我用这些文件编辑了这篇文章。你不需要
public$alumno\u id
。它已经在
加州
类中定义。另外,您正在尝试通过
校友id
搜索验证规则中的验证为整数。请重试我在回答中使用的方法。它应该会起作用。只需添加
public$alumno\u name
,将虚拟属性添加为规则中的安全属性(非整数),将排序属性
alumno\u id
更改为
alumno\u name
,并使用
$this->alumno\u name
而不是
$this->alumno\u id
进行过滤。最后,在网格视图中将
alumno\u id
替换为
alumno\u name
。这样做,可以看到索引表上的字段,但无法搜索!我用这些文件编辑了这篇文章。
[
    'attribute' => 'alumno_name',
    'value' => 'alumno.name'
],