sql >> Database >  >> RDS >> Mysql

MySQL:verzoek om een ​​JSON-object te maken met Array

Je kunt LEFT JOIN gebruiken om alle gegevens te krijgen die je nodig hebt, als je eroverheen gaat, hoef je alleen maar op te letten hoe je met welke gegevens omgaat.

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

Maar :Alleen omdat het kan, wil nog niet zeggen dat je het moet doen.

Het splitsen van deze taak in twee query's is een stuk gemakkelijker om te schrijven en te lezen. Dus als je later om de een of andere reden dit stukje code (of iemand anders) moet aanraken, zal hij blij zijn dat je de 2-query-benadering hebt gekozen.

Het is ook een goede gewoonte om taken te splitsen, dus idealiter maakt u methoden in uw database-access-layer getAllArticles() en nog een getCommentsByArticleId($id_article) . Op deze manier kon je alle opmerkingen ophalen, zonder het hele artikel te hoeven laden.



  1. Scheidingsteken voor duizendtallen in SQL Server 2008 voor een kolom

  2. MySQL-opdracht om in CSV (of vergelijkbare array) te zoeken

  3. Voer php-code voorwaardelijk uit

  4. Gebruik SQL Server-tijdgegevenstype in C#.NET-toepassing?