在Yii2中使用外键时过滤/排序列

时间:2015-09-15 08:11:40

标签: php yii2

在Yii2中,我为表格生成了model/view/controllerview/index.php显示:

<?= GridView::widget([
    'dataProvider' => $dataProvider,
    'filterModel' => $searchModel,
    'columns' => [
        ['class' => 'yii\grid\SerialColumn'],

        'username',
        'type',
        'clientid',//a foreign key to the table client          

        ['class' => 'yii\grid\ActionColumn'],
    ],
]); ?>

但是,当然,我想要从客户端显示一个名称,而不是clientid。这很容易:我必须写'clientid'而不是'client.name',而且它已经修复了。但是,我无法对列进行排序或过滤。

如何对引用另一个表的列进行排序/过滤?

2 个答案:

答案 0 :(得分:0)

您需要在GridView

中添加以下代码
[
   'attribute' => 'clientid',
   'value' => 'client.name',
]

另一个代码添加到搜索模型中,并将clientid属性放在safe中,如

public function rules()
{
        return [
            ['clientid', 'safe'],
        ];
}

并在search()函数中添加以下代码。

$query->joinWith(['client(relation_name)']);

....

$query->andFilterWhere(['like', 'client.name (table_name.field_name)', $this->clientid]);

答案 1 :(得分:0)

您需要在搜索模型中声明$ client。它对我有用。

在基础模型中:

 public function getClient()
{
    return $this->hasOne(Client::className(), ['id' => 'clientid']);
}

在搜索模型中:

public $client; 

public function rules()
{

    parent::rules();
    return array_merge(
        [
            [['client', ], 'safe'],
        ]
    );
}

在搜索功能中:

$query->joinWith('client');
$query->andFilterWhere([
        'client_id' => $this->client_id,
->andFilterWhere(['like', 'client.name', $this->client]);

在视图中:

[
  'attribute' => 'client',
  'label' => 'client name',
  'value' => 'client.name',
]

我希望这会对你有所帮助。

这是来源:http://www.yiiframework.com/wiki/621/filter-sort-by-calculated-related-fields-in-gridview-yii-2-0/