我试图在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']);
}
}
您没有分享太多细节,但您可以在一个查询中查询所有参数并避免创建模型(这似乎未使用,因为您只需要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;
}
//...
}