yii2 соединить таблицы в gridview

У меня есть основной стол и несколько вспомогательных таблиц.

Основной стол Product: productID / productNameID / productColorID

и подтаблицы

productName: productNameID / имя

productColor: productColorID / имя

В основной таблице я просто вставляю идентификаторы вложенных таблиц. И чтобы получить нормальные имена вместо идентификаторов, я использую функции в модели продукта:

public function getProductName()
{
    return $this->hasOne(ProductName::className(), ['nameID' => 'productNameID']);
}

public function getProductColor()
{
    return $this->hasOne(ProductColor::className(), ['colorID' => 'productColorID']);
}

Если я использую только модель, я могу написать $model->productName['name'] чтобы получить имя из подтаблицы.

Но я хочу создать GridView. Для этого я создал CRUD по умолчанию из Gii. Как вы знаете, GridView использует SearchModel. Когда я сделал это в списке, у меня были только идентификаторы из основной таблицы. вероятно, потому что в SearchModel не было пользовательских функций, я имею в виду, что сейчас нет соединений с подтаблицами, в которых хранятся имена. Итак, как я могу подключить свою основную таблицу к подтаблицам в GridView? Что нужно сделать для этого?

1 ответ

Есть несколько способов сделать это: сначала самый простой (я полагаю), вы можете написать имя своего отношения, а затем получить доступ к атрибуту, который вам нужно отобразить, в одной строке:

<?= GridView::widget([
    'dataProvider' => $dataProvider,
    'filterModel' => $searchModel,
    'columns' => [
        'id',

        'productName.name', // Here it is

        ['class' => 'yii\grid\ActionColumn'],
    ],
]); ?>

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

<?= GridView::widget([
    'dataProvider' => $dataProvider,
    'filterModel' => $searchModel,
    'columns' => [
        'id',

        [
            'attribute' => 'category_id',
            'value' => function (Product $product) {
                return $product->category->name;
                // make sure your model has productName, or it will throw Non-object exception
                // return $product->category ? $product->category->name : null; 
            },
        ],

        ['class' => 'yii\grid\ActionColumn'],
    ],
]); ?>

О применении поиска по этим связанным атрибутам вы можете узнать больше в документации Yiiframwork Yii 2.0: отображение, сортировка и фильтрация связей модели в GridView

Кроме того, убедитесь, что вы активно загружаете связанные таблицы, чтобы ваше сеточное представление не вызывало много отдельных запросов, используя $model->with() а также $model->joinWith() функции

Другие вопросы по тегам