TransWikia.com

Como reunir dados de duas consultas em um objeto php?

Stack Overflow em Português Asked by GustavoSevero on January 2, 2021

Estou fazendo duas consultas no BD em tabelas diferentes.
Com os dados da primeira consulta estou pegando dados na outra, porém, não consigo juntar todos os dados em um objeto json só.

<?php
include_once("con.php");

$pdo = conectar();

$pegaContaAdmin=$pdo->prepare("SELECT * FROM contaPadrao");
$pegaContaAdmin->execute();

$return = array();

while ($linhaContaAdmin=$pegaContaAdmin->fetch(PDO::FETCH_ASSOC)) {

        $idcontaPadrao = $linhaContaAdmin['idcontaPadrao'];
        $contaPadrao = $linhaContaAdmin['contaPadrao'];
        $idsubcategoriaPadrao = $linhaContaAdmin['subcategoriaPadrao_idsubcategoriaPadrao'];

        $return[] = array(
                'idcontaPadrao' => $idcontaPadrao,
                'contaPadrao'   => $contaPadrao,
            );

    $pegaDadosSubcategoria=$pdo->prepare("SELECT * FROM subcategoriaPadrao 
                                          WHERE idsubcategoriaPadrao=:idsubcategoriaPadrao");
    $pegaDadosSubcategoria->bindValue("idsubcategoriaPadrao", $idsubcategoriaPadrao);
    $pegaDadosSubcategoria->execute();


    while ($linhaDadosSubcate=$pegaDadosSubcategoria->fetch(PDO::FETCH_ASSOC)) {

            $subcategoriaPadrao = utf8_encode($linhaDadosSubcate['subcategoriaPadrao']);
            $tipo = $linhaDadosSubcate['tipo'];

        }
}

$return['subcategoriaPadrao'] = $subcategoriaPadrao;
$return['tipo'] = $tipo;

echo json_encode($return);
?>

One Answer

Conforme as mensagens nos comentários, o problema pode ser pelo uso do while não ser encadeado. Para facilitar algumas coisas, eu também mudaria um pouco a estrutura.

Em primeiro lugar, traria somente os dados necessários:

$pegaContaAdmin = $pdo->prepare("SELECT idcontaPadrao , contaPadrao , subcategoriaPadrao_idsubcategoriaPadrao FROM contaPadrao");

Como a ideia é retornar todos os dados, já utilizaria a própria PDO pra isso:

$return = $pegaContaAdmin->fetchAll(PDO::FETCH_ASSOC);
//nunca se esqueça de fechar o cursor, pode gerar problemas.
$pegaContaAdmin->closeCursor();

Para os dados da subcategoria, ao invés de um while, eu usaria um foreach, inserindo os dados no array já existente:

//o prepare pode ser deixado do lado de fora do foreach, apenas a variável que conterá o bind mudará.
$pegaDadosSubcategoria = $pdo->prepare("SELECT subcategoriaPadrao , tipo FROM subcategoriaPadrao WHERE idsubcategoriaPadrao=:idsubcategoriaPadrao");

//sendo $row passada como referência para poder alterar o valor do array $return
foreach($return as &$row)
{
    $pegaDadosSubcategoria->bindValue("idsubcategoriaPadrao", $row['idsubcategoriaPadrao');
    $pegaDadosSubcategoria->execute();

    while ($linhaDadosSubcate = $pegaDadosSubcategoria->fetch(PDO::FETCH_ASSOC)) {
        //realiza o encode que já existe em seu código
        $linhaDadosSubcate['subcategoriaPadrao'] =  utf8_encode($linhaDadosSubcate['subcategoriaPadrao']);

        //cria uma lista de subcategorias dentro de cada registro da categoria padrão
        $row['subcategoria'][] = $linhaDadosSubcate;
    }
}

//nunca se esqueça de fechar o cursor, pode gerar problemas.
$pegaDadosSubcategoria->closeCursor();

Após, é só imprimir

echo json_encode($return);

Conforme conversamos, acredito que isso resolva os seus problemas.

Answered by Gabriel Heming on January 2, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP