Performance 如何在Yii2 Kartik GridView中使用一个大查询而不是一个接一个查询?

Performance 如何在Yii2 Kartik GridView中使用一个大查询而不是一个接一个查询?,performance,gridview,yii2,Performance,Gridview,Yii2,我想要一个GridView来显示Yii2中多个表的数据。 仅举一个例子,以下是数据库结构的简化示例: 表1:条目 表2:名称 表3:某物的名称(名称\ id fk,条目\ id fk) 表4:日期(条目号fk) 表5:地点 表6:某物的放置(放置标识fk,条目标识fk) 表7:某物的放置(放置标识fk,条目标识fk) 所以有很多连接和where子句 如果我将ActiveRecord与Kartik GridView一起使用,它会逐行查询以连接其他表并将where子句放在一起。我需要在不分页的情况下

我想要一个GridView来显示Yii2中多个表的数据。 仅举一个例子,以下是数据库结构的简化示例:

表1:条目

表2:名称

表3:某物的名称(名称\ id fk,条目\ id fk)

表4:日期(条目号fk)

表5:地点

表6:某物的放置(放置标识fk,条目标识fk)

表7:某物的放置(放置标识fk,条目标识fk)

所以有很多连接和where子句

如果我将ActiveRecord与Kartik GridView一起使用,它会逐行查询以连接其他表并将where子句放在一起。我需要在不分页的情况下显示至少500-1000个结果行。这样,即使一个查询需要毫秒,也需要10-100秒来检索我需要显示的所有数据。 我还有一个datatables.net的解决方案,我有一个大的查询,我给这个查询来填充表。它有20-30倍更好的性能,这就足够了。 因此,问题是,有没有办法用一个大查询而不是大量查询来为Yii2中的GridView提供数据,以提高性能—保留过滤器和排序功能?如果是,如何进行

!!更新

因此,真正的问题是在第二层(如Place)上连接的表。它仍在查询每一行。以下是我的代码示例:

class Entry
...
public function getPlaceOfSomething() {
    return $this->hasOne(PlaceOfSomething::className(), ['id' => 'plcofsthg_id']);
}
public function getPlace() {
    return $this->hasOne(PlaceOfSomething::className(), ['id' => 'plcofsthg_id'])->joinWith('place');
}
public function getPlaceOfSomethingName() {
    return $this->Place->getPlaceName();
}

class PlaceOfSomething
...
public function getPlace() {
    return $this->hasOne(Place::className(), ['id' => 'place_id']);
}
public function getPlaceName() {
    return $this->getPlace()->one()['name'];
}

class Place is in the generated way, contains id and name
从日志中

这将在1个查询中获取所有内容(仍然是分开的,但没关系):

在('1','2','3','29','25','85','5','27','30','168','6','14','38','45','32','133','33','10','67','1057','69','73','74','95','46','103','107','108','101','52','42','308',中选择*

然后一个接一个地重复所有查询:


选择*FROM
place
WHERE
id
='33'

看看急切加载和懒惰加载,就像deacs告诉你的那样。这是官方链接:


对于datatables,您将无法解决这个问题,您仍然需要加载所有数据,只有快速加载才能解决这个问题。你应该看到你的观点有了巨大的进步。还可以使用调试工具栏确保正确实施,并观察查询数量的急剧下降。

1查询=急切加载,多查询=延迟加载,这两种情况在AR中都是完全可能的。要保留相关字段的排序和筛选功能,您应该阅读此wiki:还有其他问题。我有3个连接级别:条目->某物名称->名称。Name被加入到NameOfSomething类中。因此,如果我在条目上进行急切加载,Name表仍然会被延迟加载。有办法解决这个问题吗?(我已经通过NameOfSomething在条目模型中使用了名称模型,并且我已经将所有表加入到EntrySearch对象中)将该部分添加到查询中。您始终可以使用('Delivery.status“deleted”')->joinWith('contact')->with('deliveryProducts.product')如您所见,我加载了联系人,也加载了两个表之外的产品。是的,这是此问题的最后一次修复。非常感谢。