0

为了显示我的 GridView,我使用了这个 ActiveDataProvider:

public function search($params)
{
  $query = PublicationsPublication::find()
    ->select(['eid', 'title', 'pubdate', 'citedby', "STRING_AGG(DISTINCT(CONCAT(author.authid, ' - ', authname)), ', ') AS authors"])
    ->joinWith('publicationsAuthor')
    ->groupBy(['eid','title','pubdate','citedby']);

  $dataProvider = new ActiveDataProvider([
    'query' => $query,
  ]);
  $this->load($params);
  if (!$this->validate()) {
    return $dataProvider;
  }
  ...
}

我不知道如何在 Gridview 中使用 STRING_AGG() 函数生成的列。

以防万一,publicationsAuthor 关系是这样编码的:

public function getPublicationsAuthor() {
  return $this->hasMany(PublicationsAuthor::className(), ['authid' => 'authid'])
    ->viaTable('publications.pub_author', ['pubid' => 'id']);
}

我需要使用 STRING_AGG() 函数,因为我想在 Gridview 的一个单元格中显示许多作者。

我尝试以这种方式使用“作者”列:

$gridColumns = [
  [
    'class' => 'kartik\grid\SerialColumn',
    'width' => '20px',
  ],
  'eid',
  'title',
  'pubdate',
  'citedby',
  'authors',
];
echo GridView::widget([
  'dataProvider' => $dataProvider,
  'filterModel' => $searchModel,
  'columns' => $gridColumns,
  'pager' => [
    'firstPageLabel' => 'First',
    'lastPageLabel'  => 'Last'
  ],
  ...
]);

但不幸的是,它没有奏效。在网格中,所有值都设置为“未设置”。该查询效果很好,因为我在 PgAdmin 中对其进行了测试。

4

1 回答 1

0

yii\data\ActiveDataProvider适用于模型,因此默认情况下只有模型定义的字段可用。添加由某个表达式生成的字段的最简单方法是将具有相同名称的公共属性添加到您的模型中,如下所示:

class PublicationsPublication extends ActiveRecord
{
    public $authors;

    // ... other code in PublicationsPublication model ...
    
    public function attributeLabels()
    {
         // You can also add label for new field
         return [
             'authors' => 'Authors',
             // ... other labels ...
         ];
    }

}

公共属性$authors将加载来自authorsSQL 查询结果中字段的数据。然后你可以在网格中使用它作为任何其他字段。

另一种选择是使用yii\data\SqlDataProvider而不是yii\data\ActiveDataProvider.

于 2021-05-11T08:53:39.973 回答