Du kan LEFT JOIN for at få alle de data, du har brug for, når du itererer over det, skal du bare passe på, hvordan du håndterer hvilke data.
$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);
Men :Bare fordi du kan, betyder det ikke, at du skal.
At opdele denne opgave i to forespørgsler er meget nemmere at skrive og læse. Så hvis du senere af en eller anden grund har brug for at røre ved dette stykke kode (eller en anden), vil han være glad for, at du valgte 2-forespørgslen.
Det er også god praksis at opdele opgaver, så ideelt set ville du oprette metoder i dit database-access-layer getAllArticles()
og en anden getCommentsByArticleId($id_article)
. På denne måde kunne du hente alle kommentarerne uden at skulle indlæse hele artiklen.