Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL :Anfrage zum Erstellen eines JSON-Objekts mit Array

Sie können LEFT JOIN verwenden, um alle Daten zu erhalten, die Sie benötigen. Wenn Sie darüber iterieren, müssen Sie sich nur darum kümmern, wie Sie mit welchen Daten umgehen.

$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);

Aber :Nur weil du es kannst, heißt das nicht, dass du es solltest.

Das Aufteilen dieser Aufgabe in zwei Abfragen ist viel einfacher zu schreiben und zu lesen. Wenn Sie also später aus irgendeinem Grund dieses Stück Code (oder jemand anderen) berühren müssen, wird er froh sein, dass Sie den 2-Abfrage-Ansatz gewählt haben.

Es ist auch eine gute Praxis, Aufgaben aufzuteilen, also würden Sie idealerweise Methoden in Ihrer Datenbankzugriffsschicht getAllArticles() erstellen und ein weiteres getCommentsByArticleId($id_article) . Auf diese Weise können Sie alle Kommentare abrufen, ohne den gesamten Artikel laden zu müssen.