Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

MySQL:Solicitação para criar um objeto JSON com Array


Você pode LEFT JOIN para obter todos os dados de que precisa, ao iterar sobre eles, você só precisa cuidar de como lida com quais dados.
$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);

Mas :Só porque você pode, não significa que você deve.

Dividir essa tarefa em duas consultas é muito mais fácil de escrever e ler. Então, se você mais tarde, por algum motivo, precisar tocar neste pedaço de código (ou em outra pessoa), ele ficará feliz por você ter escolhido a abordagem de 2 consultas.

Também é uma boa prática dividir tarefas, então, idealmente, você criaria métodos em sua camada de acesso ao banco de dados getAllArticles() e outro getCommentsByArticleId($id_article) . Desta forma você pode buscar todos os comentários, sem ter que carregar o artigo inteiro.