Yii2将2个不相关的模型与一些共享属性合并到一个Gridview中

时间:2017-04-16 11:01:40

标签: php gridview yii2 yii2-model

我有2个单独的模型(用于2个单独的表),其中包含一些类似的属性,我想将它们组合成一个GridView。这些模型是无关的。

模型1:

+----+------+----------------+-----+
| id | name |     email      | age |
+----+------+----------------+-----+
|  1 | Bob  | bob@bob.bob    |  22 |
|  2 | Ross | ross@ross.ross |  24 |
+----+------+----------------+-----+

模型2:

+----+-------+-----------------+----------+-----------+
| id | name  |      email      | location | Interests |
+----+-------+-----------------+----------+-----------+
|  1 | Mr    | mr@mr.mr        | Middle   | Computers |
|  2 | Robot | robot@robot.bot | Nowhere  | Hacking   |
+----+-------+-----------------+----------+-----------+

我想将以下数据导出为CSV(使用kartik/Grid/Gridview/ExportMenu),其工作方式与GridView类似:

+----+-------+-----------------+----------+-----+-----------+
| id | name  |      email      | Location | Age | Interests |
+----+-------+-----------------+----------+-----+-----------+
|  1 | Mr    | mr@mr.mr        | Middle   |     | Computers |
|  2 | Robot | robot@robot.bot | Nowhere  |     | Hacking   |
|  3 | Bob   | bob@bob.bob     |          |  22 |           |
|  4 | Ross  | ross@ross.ross  |          |  24 |           |
+----+-------+-----------------+----------+-----+-----------+

导出小部件与CGridView的工作方式相同。您提供dataProvider(可能有分页),导出的CSV包含所有行。

目前我使用搜索模型返回2个ActiveDataProviders,然后我将它们与ArrayDataProvider结合使用:

$searchModel = new RegisteredUserSearch([$argumentsArray1]);
$dataProvider1 = $searchModel->search(Yii::$app->request->queryParams);
$dataProvider1->pagination = ['pageSize' => 12];

$collectedEmailSearchModel = new CollectedEmailSearch([$argumentsArray2]);
$dataProvider2 = $collectedEmailSearchModel->search(Yii::$app->request->queryParams);
$dataProvider2->pagination = ['pageSize' => 12];

$data = array_merge($dataProvider1->getModels(), $dataProvider2->getModels());

$dataProvider = new ArrayDataProvider([
    'allModels' => $data,
            'pagination'=>[
                'pageSize'=> 0
            ]
]);

使用$dataProvider1$dataProvider2作为GridView' dataProvider可以正常工作,但使用合并的$dataProvider会导致只导出24行。我尝试将dataProviders的pageSize更改为0,但这似乎没有什么区别。

1 个答案:

答案 0 :(得分:0)

您可以在同一封电子邮件中建立模型之间的关系。例如

在Model1.php中,您必须通过相同的电子邮件

定义关系
public function getSameEmail()
{
    return $this->hasOne(Model2::className(),['email'=>'email']);
}

要在其他表格中显示网格视图值,您必须将其加入searchModel1.php文件中。您正通过同一封电子邮件加入表格。

验证后,您可以添加您定义的关系以进行查询。喜欢这个

$查询 - > joinWith( 'sameEmail');

您将从另一个表中获取列的值。请注意具有相同名称的列。