如何在 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
。
为了显示我的 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
。