首页 > 解决方案 > YII2:从不同的表构建模型

问题描述

我是 Yii2 的新手,我对更多不同表格的模型有问题。

我有 3 个具有不同数据结构的表:

目标模型是: JobnameStartDate(存在于具有不同列的所有表中)

对表格的所有请求仍然存在限制。

作业控制器.php

            ...

            // JobOffer1
            $model = [];
          
            $sql = "SELECT Name As Jobname, Date As StartDate
            FROM JobOffer1,
                Company1 cp1,
                ...
            WHERE (cp1.availability IS NULL OR cp1.availability = 0)
            AND ... ";

            $JobOffer1 = JobOffer1::findBySql($sql)->all();
            
            foreach ($JobOffer1 as $job) {
                array_push($model, $job);

            }

            // JobOffer2
            $sql = "SELECT JobName As Jobname, StartDate As StartDate
            FROM JobOffer2,
                TableXYZ xyz,
                ...
            WHERE xyz.value > 100
            AND ... ";

            $JobOffer2 = JobOffer2::findBySql($sql)->all();
            
            foreach ($JobOffer2 as $job) {
                array_push($model, $job);

            }

            // JobOffer3
            $sql = "SELECT description As Jobname, Start As StartDate
            FROM JobOffer3,

            $JobOffer3 = JobOffer3::findBySql($sql)->all();
            
            foreach ($JobOffer3 as $job) {
                array_push($model, $job);

            }

            $data = new ArrayDataProvider([
                'allModels' => $model
            ]);


             return $this->render('index', [
                'data' => $data,
            ]);

目前,我正在使用Array. 它可以工作,但速度很慢。而且我无法过滤和搜索视图中的数据数组。

什么是最快和最好的解决方案?我的想法是通过组装 JobOffser1-3(在所有条件下)来构建 JobModel。

这是一个想法,也许有人给我一个片段?!

标签: phpmodelcontrolleryii2crud

解决方案


使用 QueryBuider 为 ActiveDataProvider 创建查询,并使用 Union 和字段别名来连接来自不同表的同名结果,如下所示:

$queryB = new QueryBuider();
$q = (new Query)->select('field1')->from('table1')->union('(select fieldN as field1 from tableN)')->union('...');
$queryB->buld($q)
$dataProvider = new ActiveDataPrivuder(['query'=>$queryB]);

推荐阅读