繁体   English   中英

是否可以通过查询和静态数据创建Yii2 ActiveDataProvider?

[英]Is there some option to create Yii2 ActiveDataProvider from query and static data?

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

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

您可能正在寻找这个https://www.yiiframework.com/doc/api/2.0/yii-data-arraydataprovider

ArrayDataProvider在许多方面与ActiveDataProvider相同,并且可以将其用作大多数Yii2控件的基础数据。 我将获取ActiveDataProvider数据,进行解析,将其与默认情况下已经拥有的数据进行匹配,并创建一个可用作ArrayDataProvider基础的数组。

如果将其放入DataGrid中,则始终可以对email列执行类似的操作

    [
        'class' => 'yii\grid\DataColumn',
        'attribute' => 'email',
        'format'=>'raw',
        'value'=>function ($model) use ($emails) {
            return $emails[$model->id];
        },
    ],

对于复杂或聚合模型,一种方法可以基于模型中的add和afterFind方法
添加所需的属性并使用适当的函数填充值,例如:named getYourRelatedEmail()
或者您可以根据您对电子邮件数组或相关值的使用方式进行分配)

在您的模型中

    public $userEmail;  

    public function afterFind()
      {
        $this->userEmail = getYourRelatedEmail();
      }

通过这种方式,您可以在gridview中访问模型数据字段作为通用模型字段

这样,您可以从不同的源检索所需的所有数据,并根据需要构建综合模型。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM