sql >> Database teknologi >  >> RDS >> Mysql

MySQL :Anmodning om at lave et JSON-objekt med Array

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.



  1. Forsøger at indstille standardværdien for afkrydsningsfeltet, hvis det ikke er markeret

  2. Check Constraint Calling af en funktion Oracle SQL-udvikler

  3. Hvordan beskytter sprintf() mod SQL-injektion?

  4. Returner rækker, der matcher elementer af input-array i plpgsql-funktionen