Yii2 GridView Отображение данных из нескольких таблиц - PullRequest
0 голосов
/ 06 сентября 2018

У меня есть 3 таблицы: product, field и product_field. поле продукта имеет 2 внешних ключа: product_id и field_id;

a product имеет много product_field s

a field имеет много product_field s

a product_field имеет один product и один field

таблица product содержит идентификатор и имя (например, «книга»). таблица field содержит идентификатор и имя (например, 'ean-code') таблица product_field содержит идентификатор, product_id, field_id и значение (например, '19886431')

отношения для каждой таблицы присутствуют в моделях ActiveRecord, сгенерированных GII.

Мое действие контроллера выглядит так:

$producSearchModel = new ProductSearch();

$params = Yii::$app->request->queryParams;

$productDataProvider = $productSearchModel->search($params);

return $this->render('index', [
  'productSearchModel'   => $productSearchModel,
  'productDataProvider'  => $productDataProvider,
]);

Моя функция поиска () в productSearchModel выглядит следующим образом:

public function search($params){

    $query = new Query();
    $query  ->select([ '*', 'field.name as fieldname'])
      ->from('product')
      ->join(   'INNER JOIN',
          'product_field',
        'product_field.product_id = product.id'
      )  ->join(    'INNER JOIN',
        'field',
        'product_field.field_id = field.id'
      );


    $dataProvider = new ActiveDataProvider([
      'query' => $query,
      'pagination' => [
        'pageSize' => 30,
      ],
    ]);

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

    return $dataProvider;

}

Теперь все выглядит хорошо, мой столбец сетки показывает 2 строки со всеми полями, и это именно то, что он должен делать.

Я хочу показать столбец для имени поля и в каждой строке значение из поля product_field.

Как это должно выглядеть: enter image description here

Может кто-нибудь сказать мне, как этого добиться?

1 Ответ

0 голосов
/ 06 сентября 2018

Вы должны проверить ниже, чтобы он работал:

  • Продукт имеет много значений product_field, поэтому данные product_field должны отображаться под действием просмотра продукта, например: /product/1
  • В действии view ProductController у вас есть идентификатор текущего продукта, так что вы можете сделать:

    $productFieldSearchModel=new ProductFieldSearch();
    $productFieldSearchModel->product_id=$productId;
    $dataProvider = $productFieldSearchModel->search(Yii::$app->request->queryParams);
    
  • Теперь вы можете перейти к представлению визуализации, имеющему DetailView верхней части продукта и под ним вы можете иметь GridView для поля продукта этого конкретного элемента

...