Yii Framework 2.0 GridView и данные из таблицы соединений

У меня есть две таблицы базы данных «пользователь» и «роль». Я использовал Yii Framework 2.0 Gii для создания CRUD с моделью User и моделью UserSearch. По умолчанию Gii использует GridView :: widget для страницы индекса для модели «пользователь».

В методе поиска ($ params) внутри модели UserSearch я использовал следующий код для объединения вышеуказанных таблиц

$query = User::find()->with('role');

Все отлично работает с запросом.

По умолчанию Gii не включает данные из объединенной таблицы «роль» в виджет GridView :: внутри страницы views / user / index.php. С помощью вышеприведенного запроса на соединение я могу получить данные из обеих таблиц. На странице views / user / index.php я внедрил виджет GridView :: со следующим кодом, чтобы он также включал имена данных и столбцов из объединенной таблицы (роль).

<?= GridView::widget([
'dataProvider' => $dataProvider,
'filterModel' => $searchModel,
'columns' => [
['class' => 'yii\grid\SerialColumn'],
'userid',
'username',
'role.role_name',
['class' => 'yii\grid\ActionColumn'],
],
]); ?>

Все отлично работает с ролью data_name, включенной в виджет GridView ::. Но проблема в том, что в поле для имени роли отсутствует окно поиска. Виджет GridView :: создает окно поиска только для свойств пользователя. Есть ли способ добавить окно поиска для свойств объединенной таблицы «роль», потому что я также хотел бы искать через «роль_имя», а также через другие свойства модели пользователя.

6

Решение

Попробуйте так:

В вашей модели 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.

3

Другие решения

  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'],
],
]); ?>
1

Попробуйте это с

<?= 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'],
],
]); ?>

Я только что попробовал это в своем коде, поэтому я не уверен, что это работает и с вашим кодом. Но если так, я не знаю, почему это должно быть определено таким образом.

Я предполагаю, что ответ Раджеша Уджаде также включает это определение для Yii 1.

0

Это сработало для меня
Таблица = Lead (id, year_id)
Таблица = Год (идентификатор, текст)

Добавлен текст в начале (index.php)
Year :: find () -> all () = Этот код извлекает все значения из таблицы / всех лет.

            [
'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' => '---']),

],

Также это показывает выпадающее меню, а также сортировку.

изображение, показывающее Dropdown в Grdiview

0

@Ekonoval идет в правильном направлении.

Просто добавьте следующее в функцию поиска в UserSearch:

После инициализации объекта 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]
];
0

Вы можете написать запрос в вашей модели UserSearch как

if($this->role)
{
$query->join('LEFT JOIN','role','role.user_id =   user.id')->andFilterWhere(['role.item_name' => $this->role]);
}
0
По вопросам рекламы [email protected]