sql >> Databasteknik >  >> RDS >> Mysql

MySQL :Begäran om att göra ett JSON-objekt med Array

Du kan LEFT JOIN för att få all data du behöver, när du itererar över den måste du bara ta hand om hur du hanterar vilken 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 :Bara för att du kan betyder det inte att du borde.

Att dela upp denna uppgift i två frågor är mycket lättare att skriva och läsa. Så om du senare av någon anledning behöver röra denna kodbit (eller någon annan) kommer han att vara glad att du valde metoden med två frågor.

Det är också bra att dela upp uppgifter, så helst skulle du skapa metoder i ditt databas-access-lager getAllArticles() och en annan getCommentsByArticleId($id_article) . På så sätt kunde du hämta alla kommentarer, utan att behöva ladda hela artikeln.



  1. SQL Server – Spelar kolumnordningen någon roll?

  2. DefType-uttalanden i VBA:The Dark Side of Backward Compatibility

  3. Hur återställer man det bortglömda MySQL root-lösenordet?

  4. Konvertera avgränsad sträng till rader i oracle