1

正如我在另一个问题中发现的那样,使用 Doctrine 将 300k 行作为实体加载不是一个好主意,并且会消耗至少 1 GB 的内存。

因为无论如何我都需要一些按位运算,所以我想我会使用 aNativeQueryiterate()结果。但是,在第一行之后,我的值始终为空。我的代码与文档高度相似:

$sql = "SELECT `pushToken` FROM `Devices`";
$rsm = new Doctrine\ORM\Query\ResultSetMappingBuilder(self::$entityManager);
$rsm->addScalarResult("pushToken", "pt");
$query = self::$entityManager->createNativeQuery($sql, $rsm);
$iterableDevices = $query->iterate();
foreach ($iterableDevices as $row)
{
    $message->addRecipient($row[0]["pt"]);
}

然而,当我var_dump编辑$row时,我注意到每次代码运行循环时索引实际上都会增加。这与文档相矛盾。我做错了什么,还是我发现了一个诚实的错误?

4

1 回答 1

0

我在这里找到了解决方案将所有子数组合并为一个并这样做:

$iterator = $this->getEntityManager()->createNativeQuery($sql, $rsm)->iterate();
foreach ($iterator as $row) {
    yield call_user_func_array('array_merge', $row);
}
于 2021-04-30T09:31:58.067 回答