LEFT JOINを使用して、必要なすべてのデータを取得できます。データを反復処理するときは、どのデータを処理するかを注意する必要があります。
$lastArticleId = null;
$comments = [];
$elements = [];
$sql = 'SELECT Articles.*, Comments.content AS comment, Comments.username FROM Articles LEFT JOIN Comments ON Articles.id = Comments.id_article';
$result = $pdo->query($sql);
foreach ($result->fetchAll(PDO::FETCH_OBJ) as $dataset) {
if($lastArticleId !== $dataset->id){
$lastArticleId = $dataset->id;
$elements[$lastArticleId] = [
'id' => $dataset->id,
'title' => $dataset->title,
'content' => $dataset->content,
'date' => $dataset->date,
'comments' => [],
];
}
$comments[$lastArticleId][] = [
'content' => $dataset->comment,
'username' => $dataset->username,
];
}
foreach ($elements as $key => $article) {
$article['comments'] = $comments[$key];
$fullData[] = $article;
}
echo json_encode($fullData);
しかし :できるからといって、そうすべきだという意味ではありません。
このタスクを2つのクエリに分割すると、書き込みと読み取りがはるかに簡単になります。したがって、後で何らかの理由でこのコード(または他の誰か)に触れる必要がある場合は、2クエリアプローチを選択して喜んでいただけます。
また、タスクを分割することをお勧めします。そのため、理想的には、データベースアクセス層のgetAllArticles()
にメソッドを作成します。 もう1つはgetCommentsByArticleId($id_article)
。このようにして、記事全体を読み込むことなく、すべてのコメントを取得できます。