如何在 Yii2 GridView 中集成 SQL-Generated columns

How to integrate SQL-Generated columns in Yii2 GridView

为了显示我的 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 中对其进行了测试。

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

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 ...
         ];
    }

}

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

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