我有主表和几个子表。
主要表产品: productID / productNameID / productColorID
和子表
productName : productNameID / name
productColor : productColorID / name
在主表中我只插入子表的ID。 为了获得普通名称而不是ID,我使用产品模型中的函数:
public function getProductName()
{
return $this->hasOne(ProductName::className(), ['nameID' => 'productNameID']);
}
public function getProductColor()
{
return $this->hasOne(ProductColor::className(), ['colorID' => 'productColorID']);
}
如果我只在视图中使用模型,我可以写$model->productName['name']
从子表中获取名称。
但我想创建GridView。为此我从Gii创建了默认的CRUD。如您所知,GridView使用SearchModel。 当我在列表中执行此操作时,我只有主表中的ID。可能是因为SearchModel中没有自定义函数 我的意思是现在没有与存储名称的子表的连接。 那么如何将主表连接到GridView中的子表?应该怎么做才能做到这一点?
答案 0 :(得分:2)
有几种方法可以做到: 第一个是最简单的(我建议),您可以编写关系的名称,然后访问您需要在一个字符串中显示的属性:
<?= 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: Displaying, Sorting and Filtering Model Relations on a GridView
中了解更多信息此外,请确保您急切加载相关表格,以便您的gridview不会使用$model->with()
和$model->joinWith()
函数调用大量单独的查询