如何在不使用 getChildIds 的情况下递归获取 Modx Revolution 中的子 ID 数组

How to recursively get an array of child ids in Modx Revolution without using getChildIds

getChildIds 如果运行针对大量资源使用它可能会非常慢,所以我正在尝试编写一个查询和一些代码来更快地获取所有子 ID。

但是我从 getChildIds 和我的脚本中得到了不同的结果。

谁能看出为什么这些会产生不同的结果?

使用 getChildIDs 的方法:

$parentDepth = isset($scriptProperties['parentDepth']) ? $scriptProperties['parentDepth'] : 5;

$parents = explode(',', $parents);

$children = array();

foreach ($parents as $parent){

    $ids = $modx->getChildIds($parent,10,array('context' => 'web'));

    foreach($ids as $id){

        $children[] = $id;

    }


}

echo ' number of children = ' . count($children);

使用查询和循环的方法:

$comma_separated = implode(",", $parents);

$sql = "SELECT `id` from modx_site_content where `parent` IN  (".$comma_separated.") and  published = 1 and isfolder = 0 and deleted = 0 and hidemenu = 0;";

$results = $modx->query($sql);

$mychildren = array();

while ($row = $results->fetch(PDO::FETCH_ASSOC)) {


    $mychildren[] = $row['id'];

}


for($i=0; $i <= 10; $i++){

  $comma_separated = implode(",", $mychildren);

  $sql = "SELECT `id` from modx_site_content where `parent` IN  (".$comma_separated.") and  published = 1 and isfolder = 0 and deleted = 0 and hidemenu = 0;";

  $results = $modx->query($sql);

  while ($row = $results->fetch(PDO::FETCH_ASSOC)) {


      $mychildren[] = $row['id'];

  }
}

echo ' number of children = ' . count($mychildren);

getChildIDs 方法需要将近 1.5 秒才能 运行 并给出大约 1100 个结果

SQL/script 方法运行不到 0.1 秒,给出了 1700 个结果。

要么是我没有正确地将子 ID 附加到数组中,要么是 getChildIDs 过滤掉了一些其他结果?

有人知道这里可能发生的事情吗?

getChildIds - 是递归的,所以默认情况下速度较慢。

您可以尝试使用built-in method of pdoFetch

$pdo = $modx->getService('pdoFetch');
$ids = $pdo->getChildIds('modResource', 0);
print_r($ids);

它也是递归的,但在某些情况下会更好。 当然,您需要先从存储库中install pdoTools

再次查看代码,现在结果的差异非常明显。我将结果附加到 child id 数组,它插入了重复项,因为一个 parent 可以有很多 children.

避免重复的解决方案:

$mychildren[$row['id']] = $row['id'];