我使用ActiveDataProvider使用GridView显示一些数据。我也从API中检索了一些数据,这是一个数组。例如:
$emails = [
'123' => 'john@test.io',
'234' => 'jane@test.io',
'345' => 'jake@test.io'
];
$query = new Query();
$query->select(['id', 'username'])->from('user');
$provider = new \yii\data\ActiveDataProvider([
'query' => $query,
'pagination' => [
'pageSize' => 100,
],
]);
显示此ActiveDataProvider的结果将如下所示:
+------+--------------+
| id | username |
+------+--------------+
| 123 | John |
| 234 | Jane |
| 345 | Jake |
+------+--------------+
如何从查询和数组中加入数据以获得如下内容:
+------+--------------+-------------------+
| id | username | email |
+------+--------------+-------------------+
| 123 | John | john@test.io |
| 234 | Jane | jane@test.io |
| 345 | Jake | jake@test.io |
+------+--------------+-------------------+
我找到了唯一的选项 - 从查询创建一个数组并将其与现有数组合并,但对我来说这看起来很糟糕。还有其他解决方案吗?
答案 0 :(得分:3)
你可能正在寻找这个 https://www.yiiframework.com/doc/api/2.0/yii-data-arraydataprovider
ArrayDataProvider的作用方式与ActiveDataProvider相同,您可以将其用作大多数Yii2控件的基础数据。我将获取ActiveDataProvider数据,解析它,将其与默认情况下的数据匹配,并创建一个可用作ArrayDataProvider基础的数组。
如果您将其放入DataGrid,您可以随时为电子邮件列
执行此类操作 [
'class' => 'yii\grid\DataColumn',
'attribute' => 'email',
'format'=>'raw',
'value'=>function ($model) use ($emails) {
return $emails[$model->id];
},
],
答案 1 :(得分:0)
对于复杂或聚合模型,可以基于模型中的add和afterFind方法
添加您需要的属性并使用适当的函数填充您的值,例如:named getYourRelatedEmail()
或者您可以根据您对电子邮件阵列或相关值的使用方式使用分配)
在你的模特中
public $userEmail;
public function afterFind()
{
$this->userEmail = getYourRelatedEmail();
}
通过这种方式,您可以在gridview中访问模型数据字段作为通用模型字段
通过这种方式,您可以从不同来源中检索所需的所有数据,并根据需要构建yuor复合模型。