我有两个数据库表'user'和'role'。我使用Yii framework 2.0 Gii用User模型和UserSearch模型创建CRUD。默认情况下,Gii使用GridView :: widget作为“用户”模型的索引页面。
在UserSearch模型内部的搜索($ params)方法中,我使用以下代码将上述表连接在一起
$query = User::find()->with('role');
查询一切正常。
默认情况下,Gii不包含来自views / user / index.php页面内GridView :: widget中的连接表'role'的数据。通过上面的连接查询,我可以从两个表中检索数据。在views / user / index.php页面中,我使用以下代码注入了GridView :: widget,以便它还包括连接表(角色)中的数据和列名。
<?= GridView::widget([
'dataProvider' => $dataProvider,
'filterModel' => $searchModel,
'columns' => [
['class' => 'yii\grid\SerialColumn'],
'userid',
'username',
'role.role_name',
['class' => 'yii\grid\ActionColumn'],
],
]); ?>
使用GridView :: widget中包含的角色数据'role_name,一切正常。但问题是role_name没有搜索框。 GridView :: widget仅为User属性创建搜索框。有没有办法为联接表'role'的属性添加搜索框,因为我还想搜索'role_name'以及User模型的其他属性。
答案 0 :(得分:3)
尝试这种方式:
在您的UserSearch模型中添加
UserSearch extends ...
{
public $roleFilterInputName; //the name of the filter search input
//important
function rules()
{
//add roleFilterInputName as safe
return [
[['xxx', 'roleFilterInputName'], 'safe'], //!!!!
];
}
}
你网格中的:
'columns':
[
//...
[
'attribute' => 'roleFilterInputName',
'value' => 'role.role_name'
],
//...
]
在UserSearch :: search()
中$query->andFilterWhere(['like', 'role.role_name', $this->roleFilterInputName])
但我想你必须使用'joinWith'代替'with'。
答案 1 :(得分:1)
在CGridView里面添加以下代码。它将使用dropDownList启用过滤器。
[
'attribute' => 'act_role_id',
'label' => 'Actor Role',
'value' => 'actRole.role_name',
'filter' => yii\helpers\ArrayHelper::map(app\models\ActorRole::find()->orderBy('role_name')->asArray()->all(),'act_role_id','role_name')
],
CGridView代码片段如下:
<?= GridView::widget([
'dataProvider' => $dataProvider,
'filterModel' => $searchModel,
'columns' => [
['class' => 'yii\grid\SerialColumn'],
'userid',
'username',
[
'attribute' => 'act_role_id',
'label' => 'Actor Role',
'value' => 'actRole.role_name',
'filter' => yii\helpers\ArrayHelper::map(app\models\ActorRole::find()->orderBy('role_name')->asArray()->all(),'act_role_id','role_name')
],
['class' => 'yii\grid\ActionColumn'],
],
]); ?>
答案 2 :(得分:0)
尝试
<?= GridView::widget([
'dataProvider' => $dataProvider,
'filterModel' => $searchModel,
'columns' => [
['class' => 'yii\grid\SerialColumn'],
'userid',
'username',
//'role.role_name',
['attribute' => 'role', 'value' => 'role.role_name'],
['class' => 'yii\grid\ActionColumn'],
],
]); ?>
我刚刚在我的代码中尝试过,所以我不确定这是否适用于您的代码。但如果是这样,我不知道为什么必须这样定义。
我猜rajesh ujade的答案也包含了Yii 1的定义。
答案 3 :(得分:0)
这对我有用 表= Lead(id,year_id) 表=年(id,文本)
在铅中添加了文字(index.php) Year :: find() - &gt; all()=此代码从table / all years中提取所有值。
[
'attribute'=> 'year_id',
'format' => 'html',
'value' => 'year.value',
'label' => 'Year',
'filter' => Html::activeDropDownList($searchModel, 'year', yii\helpers\ArrayHelper::map(Year::find()->all(), 'year_id', 'value'), ['class' => 'form-control', 'prompt' => '---']),
],
它还显示下拉列表以及排序。
答案 4 :(得分:0)
@Ekonoval正在以正确的方式进行。
只需在UserSearch的serch函数中添加以下内容:
在初始化ActiveDataProvider对象之后:
$dataProvider = new ActiveDataProvider([
'query' => $query,
'pagination' => [
'pageSize' => 5,
],
]);
$dataProvider->sort->attributes['roleFilterInputName'] = [
'asc' => ['role.role_name' => SORT_ASC],
'desc' => ['role.role_name' => SORT_DESC]
];
答案 5 :(得分:0)
您可以在UserSearch模型中编写查询,如
if($this->role)
{
$query->join('LEFT JOIN','role','role.user_id = user.id')->andFilterWhere(['role.item_name' => $this->role]);
}