是否有一些选项可以从查询和静态数据创建Yii2 ActiveDataProvider?

时间:2018-03-27 05:54:39

标签: php yii2

我使用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      |
+------+--------------+-------------------+

我找到了唯一的选项 - 从查询创建一个数组并将其与现有数组合并,但对我来说这看起来很糟糕。还有其他解决方案吗?

2 个答案:

答案 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复合模型。