У меня есть две таблицы базы данных «пользователь» и «роль». Я использовал 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 :: создает окно поиска только для свойств пользователя. Есть ли способ добавить окно поиска для свойств объединенной таблицы «роль», потому что я также хотел бы искать через «роль_имя», а также через другие свойства модели пользователя.
Попробуйте так:
В вашей модели 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.
Внутри 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'],
],
]); ?>
Попробуйте это с
<?= 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.
Это сработало для меня
Таблица = 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' => '---']),
],
Также это показывает выпадающее меню, а также сортировку.
@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]
];
Вы можете написать запрос в вашей модели UserSearch как
if($this->role)
{
$query->join('LEFT JOIN','role','role.user_id = user.id')->andFilterWhere(['role.item_name' => $this->role]);
}