YII2: построение модели из разных таблиц - PullRequest
0 голосов
/ 07 марта 2019

Я новичок в Yii2, и у меня проблема с моделью из более разных таблиц.

У меня есть 3 таблицы с другой структурой данных:

  • JobOffer1 (Имя, ID, Дата, ...)
  • JobOffer2 (JobName, StartDate, Location, ...)
  • JobOffer3 (описание, начало)

ЦельМодель: Jobname, StartDate (присутствует во всех таблицах с разными столбцами)

Все еще существуют ограничения для всех запросов к таблицам.

JobController.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.Это работает, но это очень медленно.И я не могу фильтровать и искать массив данных в представлении.

Какое самое быстрое и лучшее решение?Моя идея состоит в том, чтобы создать JobModel путем сборки JobOffser1-3 (со всеми условиями).

Это была бы идея, и, возможно, у кого-то есть фрагмент для меня?!

1 Ответ

0 голосов
/ 08 марта 2019

Используйте QueryBuider для создания запроса для ActiveDataProvider и используйте объединение и псевдонимы полей для результатов объединения из разных таблиц с одинаковыми именами, например:

$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]);
...