$categories = Category::with( 'childrenRecursive' )->whereNull( 'parent_id' )->get();
我能够使用递归公式来计算每个类别下的页数,而不会减慢页面速度:
foreach( $categories as $category ) {
$category->pagesCount = 0;
$category->pagesCount += $category->pages->count();
foreach( $category->childrenRecursive as $child ) {
$category->pagesCount += countChildPages( $child );
}
}
function countChildPages( $category ) {
$category->pagesCount = 0;
$category->pagesCount += $category->pages->count();
foreach( $category->childrenRecursive as $child ) {
$category->pagesCount += countChildPages( $child );
}
return $category->pagesCount;
}
例子
sitemap.html页面的名称:
foreach( $categories as $category ) {
$category->pagesCount = 0;
$category->pagesCount += $category->pages->count();
foreach( $category->childrenRecursive as $child ) {
$category->pagesCount += countChildPages( $child );
}
}
foreach( $categories as $category ) {
if( $category->pagesCount > 0 ) {
echo '<div class="category">';
echo '<h2><a href="https://example.com/' . $category->slug . '">' . $category->name . ' (' . $category->pagesCount . ')</a></h2>';
foreach( $category->pages as $page ) {
showPage( $page );
}
foreach( $category->childrenRecursive as $child ) {
showSubCategory( $child );
}
echo '</div>';
}
}
function countChildPages( $category ) {
$category->pagesCount = 0;
$category->pagesCount += $category->pages->count();
foreach( $category->childrenRecursive as $child ) {
$category->pagesCount += countChildPages( $child );
}
return $category->pagesCount;
}
function showSubCategory( $category ) {
if( $category->pagesCount > 0 ) {
echo '<div class="category">';
echo '<h2><a href="https://example.com/' . $category->slug . '">' . $category->name . ' (' . $category->pagesCount . ')</a></h2>';
foreach( $category->pages as $page ) {
showPage( $page );
}
foreach( $category->childrenRecursive as $child ) {
showSubCategory( $child );
}
echo '</div>';
}
}
function showPage( $page ) {
echo '<div class="category page">';
echo '<h2><a href="https://example.com/' . $page->slug . '">' . $page->title . '</a></h2>';
echo '</div>';
}