在设置页面限制之前加载 Magento 2 集合

Magento 2 collection loads before setting page limit

在具有大量记录的模型上执行批量操作时出现内存耗尽错误。我试图通过对集合设置限制来优化它,但是似乎在设置限制之前加载了完整的集合。这是导致内存耗尽的代码:

$collection = $this->filter->getCollection($this->collectionFactory->create())->setPageSize(1)->setCurPage(1);

它在 mass action 的控制器执行方法中。

编辑:所以我猜 Magento\Ui\Component\MassAction::getFilterIds() 是错误的,因为它在一个数组中生成所有选定的 id,稍后在语句中执行 sql 以过滤需要使用哪些模型行。不确定我是否可以修复它。

$collection = $this->filter->getCollection($this->collectionFactory->create()->setPageSize(1)->setCurPage(1));

创建集合后立即移动页面限制。

很明显,问题出在 Magento\Ui\Component\MassAction::getCollection() 内部,它在 filter->getCollection() 方法内部调用。 Id retrievieng 方法有两个选项 - 要么依靠数据提供者获取选定的 id,这是优化的选项,要么遍历每个项目并将其 id 添加到数组中。问题是我们没有使用第一个选项,为此我们的模块 UI 组件的数据提供者需要扩展 Magento\Ui\DataProvider\AbstractDataProvider.