我有3个表,我通过使用Field表与What表建立了关系。我想在Gridview中的What表中显示名称行。但是它显示了由逗号分隔的数据行。我希望每个数据都在不同的列中。喜欢带有重复字段的sql查询结果。
这是我的tbon.php模型:
public function getWhat()
{
return $this->hasMany(What::className(), ['idw' => 'idw'])
->viaTable('Field', ['id' => 'id']);
}
public function getField()
{
return $this->hasMany(Field::className(), ['id' => 'id']);
}
在TbonSearch.php中添加了以下代码:
public $what;
public $field;
和
[['field','what'],'safe']
在搜索方法中,我添加了:
$query = Tbon::find()
->joinWith(['field'])
->joinWith(['what']);
并进行排序:
$dataProvider->sort->attributes['what'] = [
'asc' => ['what.name' => SORT_ASC],
'desc' => ['what.name' => SORT_DESC],
];
并添加搜索过滤器:
->andFilterWhere(['like', 'what.name', $this->what]);
索引中的我添加了这段代码,这就是问题,我想:
<?= GridView::widget([
'dataProvider' => $dataProvider,
'filterModel' => $searchModel,
'columns' => [
['class' => 'yii\grid\SerialColumn'],
'id',
[
'label'=>'Name',
'attribute' => 'what',
'value' => function ($data) {
$str = '';
foreach($data->what as $name) {
$str .= $name->name.',';
}
return $str;
},
],
数据是这样的:a,b,c,d为名称字段!但我想要ID和a然后在下一行ID和b等。
任何帮助将不胜感激!
答案 0 :(得分:0)
我不知道你的代码而且我没有意思,但我可以回答一下。
GridView用于查看网格中的数据。 GridView中的一行表示数据集并以表格的形式显示数据。
foreach($data->what as $name) {
$str .= $name->name.',';
}
我假设您要显示关系内容的名称属性。您只需使用 tablename.columnname 语法即可实现此目的。
<?= GridView::widget([
'dataProvider' => $dataProvider,
'filterModel' => $searchModel,
'columns' => [
['class' => 'yii\grid\SerialColumn'],
'id',
[
'label'=>'Name',
'attribute' => 'what.name',
],
如果您想另外显示ID列:
<?= GridView::widget([
'dataProvider' => $dataProvider,
'filterModel' => $searchModel,
'columns' => [
['class' => 'yii\grid\SerialColumn'],
'id',
[
'label'=>'Name',
'attribute' => 'what',
'value' => function ($data) {
$str = '';
foreach($data->what as $name) {
$str .= ' ';
$str .= $name->id.'';
$str .= $name->name.',';
}
return $str;
},
],
更准确(根据您的问题)。我们有一个带有联结表的数据模型,如下面的简单书籍数据库。
示例:
如果要在标准CRUD生成的索引Gridview上显示作者的姓名,可以执行以下操作:
<?= GridView::widget([
'dataProvider' => $dataProvider,
'filterModel' => $searchModel,
'columns' => [
['class' => 'yii\grid\SerialColumn'],
'id',
'book_name',
[
'label'=>'Author(s)',
'value' => function ($dataProvider) {
$str = '';
foreach($dataProvider->authors as $name) {
$str .= ' ';
$str .= $name->id.' ';
$str .= $name->author_name.',';
}
return $str;
},
],
['class' => 'yii\grid\ActionColumn'],
],
]); ?>
结果:
此外,您可以编辑详细信息视图以在额外的Gridview中显示此类信息。结果可能如下所示。
要实现这一目标,您必须:
view.php又称视图
use yii\grid\GridView;
// other code
<?= GridView::widget([
'dataProvider' => $dataProvider,
'columns' => [
'id',
[
'attribute' => 'author.author_name',
'header' => 'Author(s)',
],
],
]); ?>
BookController.php又名控制器
public function actionView($id)
{
$dataProvider = Book::getAllAuthors($id);
return $this->render('view', [
'model' => $this->findModel($id),
'dataProvider' => $dataProvider,
]);
}
Book.php又名模型
use \yii\data\ActiveDataProvider;
// other code
public static function getAllAuthors($id) {
$query = BookAuthor::find()->where(['book_id' => $id]);
$dataProvider = new ActiveDataProvider([
'query' => $query,
]);
return $dataProvider;
}