YII2将2个无关的模型与一些共享属性组合为一个GridView



i有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,但这似乎没有区别。

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

在Model1.php中,您必须在这种情况下通过同一电子邮件定义关系

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

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

验证后,您可以将定义的关系添加到查询中。像这样

$ query-> joinwith('Sameemail'(;

您将从另一个表获得列值。请小心具有相同名称的列。

最新更新