N + 1問題

このコードでは、まず全ての記事を取得し、その後、各記事の著者情報を取得するためにfetchAuthorメソッドを呼び出しています。
このアプローチでは、記事ごとに1回のクエリが発行され、記事の数(N)に比例して追加のクエリが発生します。
これがN + 1問題の本質です。

<?php

// 記事を取得
$articles = Article::fetchAll();

// 各記事の著者情報を表示
foreach ($articles as $article) {
    $author = $article->fetchAuthor(); // N回のクエリ(記事数に応じてNが増加)
    echo "記事: " . $article->getTitle() . ", 著者: " . $author->getName() . "<br>";
}
                    

N + 1問題の改善例

このコードでは、fetchAllWithAuthorsメソッド内で実行されるJOINを活用して記事と著者情報を一度のクエリで取得しています。
このアプローチを使用することで、N + 1問題が解決され、効率的なデータベースアクセスが実現されます。

<?php

// 記事と著者情報を一度のクエリで取得
$articles = Article::fetchAllWithAuthors();

// 各記事の著者情報を表示
foreach ($articles as $article) {
    $author = $article->getAuthor();
    echo "記事: " . $article->getTitle() . ", 著者: " . $author->getName() . "<br>";
}