在Yii2中,我为表格生成了model/view/controller
。 view/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'
,而且它已经修复了。但是,我无法对列进行排序或过滤。
如何对引用另一个表的列进行排序/过滤?
答案 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/