Модель YII2 для объекта OrderObject - PullRequest
0 голосов
/ 05 апреля 2019

Я пытаюсь создать высокопроизводительную модель в YII2. У меня подключено 2 базы данных (MSSQSL: собственная и ERP-система) - все работает. Сейчас я пытаюсь загрузить заказ из системы ERP. Система распределяет всю информацию о заказах по разным таблицам.

стол: заказ

CREATE TABLE [dbo].[Order](
    [ID] [uniqueidentifier] ROWGUIDCOL  NOT NULL,
    [orderid] [int] NULL,
    [name] [varchar](10) NULL,
    [type] [tinyint] NOT NULL,
    [lastupdate] [smalldatetime] NOT NULL,
....

таблица: информация для заказа1

CREATE TABLE [dbo].[Order_Information1](
    [ID] [uniqueidentifier] ROWGUIDCOL  NOT NULL,
    [Parameter] [int] NULL,
    [Value] [varchar](255) NULL,
....

таблица: информация для заказа2

CREATE TABLE [dbo].[Order_Information2](
    [ID] [uniqueidentifier] ROWGUIDCOL  NOT NULL,
    [Parameter] [int] NULL,
    [Value] [varchar](255) NULL,
....

Я создал для всех моделей, а также могу получить индивидуальный доступ к таблицам. В модели заказа я построил класс GetInformationData:

public function getInformationData ()
{

    $description = Order_Information2::find()->select('Value')->where(['ID' => $this->id, 'Parameter' => 'txt_ description'])->one();
    //...
    $this->description =  !empty($description) ? $description->Value : '';
    //...
}
    //...

Это работает, но очень медленно. Каждый заказ имеет около 500 параметров и это займет половину вечности, пока все не загружено; - (

Я попытался подключить модель, но, к сожалению, безуспешно.

class Order extends ActiveRecord
{
    // ...

    public function getOrder_Information1()
    {
        return $this->hasMany(Order_Information1::className(), ['id' => 'id']);
    }
}

class Order_Information1 extends ActiveRecord
{
    // ...

    public function getOrder()
    {
        return $this->hasOne(Order::className(), ['id' => 'id']);
    }
}

1 Ответ

0 голосов
/ 05 апреля 2019

Вы не поделились подробностями, но вы можете запросить все параметры в одном запросе и избежать создания модели (которая кажется неиспользованной, поскольку вам нужно только Value):

public function getInformationData () {
    $data = Order_Information2::find()
        ->select(['Parameter', 'Value'])
        ->where(['ID' => $this->id])
        ->asArray()
        ->all();
    foreach ($data as ['Parameter' => $parameter, 'Value' => $value]) {
        $this->$parameter = $value;
    }
    //...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...