Yii2 gridview произвольное количество столбцов из соединительной таблицы - PullRequest
0 голосов
/ 21 февраля 2019

Допустим, у меня есть таблицы и модели "запись", "категория", "группа".

Отношения:

  • запись имеет много категорий (соединение)
  • В категории есть много групп enter image description here

Я хочу сделать следующее:

Если есть две категории, и у этих категорий есть несколько групп,Для каждой записи я хочу выбрать группу для каждой категории.Пока здесь нет проблем.

На странице "запись / индекс" в сетке я хотел бы показать и отфильтровать эти группы для каждой категории.

Для этого мне нужнодобавить произвольное количество столбцов (в этом случае это два для двух категорий) в gridview.Это также выполнимо, но фильтрация и сортировка кажется невозможным.

Мой метод поиска:

public $categories;

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

public function search($params)
{
    $query = Record::find();

    $query->joinWith('recordToRecordCategories');

    $dataProvider = new ActiveDataProvider([
        'query' => $query,
        'sort' => ['defaultOrder' => ['CreateDate' => SORT_DESC]],
        'pagination' => [
            'pageSize' => 50,
        ],
    ]);

    $this->load($params);

    if (!$this->validate()) {
        return $dataProvider;
    }

    // grid filtering conditions
    $query->andFilterWhere([
        'id' => $this->id,
        .
        .
    ]);

    // Here we search the attributes of our relations using our previously configured
    // ones in "record_to_record_category"
    if (!empty($this->categories)) {
        foreach ($this->categories as $category) {
            $query->andFilterWhere(['record_to_record_category.record_group_id' => $category]);
        }
    }

    return $dataProvider;
}

В представлении я пробовал этот код:

foreach ($recordCategories as $recordCategory) {
    array_push(
        $gridColumns,
        [
            'attribute' => 'categories[' . $recordCategory->id . ']',
            'label' => $recordCategory->name,
            'value' => function ($model, $key, $index, $column) {
                $returnVal = "";
                foreach ($model->recordToRecordCategories as $recordToRecordCategory) {
                    if ($recordToRecordCategory->recordCategory->name == $column->label) {
                        $returnVal = $recordToRecordCategory->recordGroup->name;
                    }
                }
                return $returnVal;
            },
            'filter' => ArrayHelper::map($recordCategory->getRecordGroups()->asArray()->all(), 'id', 'name'),
            'filterInputOptions' => [
                'class' => 'form-control',
                'prompt' => Yii::t('app', 'All')
            ],
        ]
    );
}

иэто не работает: (

Что я должен изменить в поисковой модели и индексе.

...