Esta não é uma limitação do PDO, é uma limitação da biblioteca cliente MySQL. O MySQL suporta apenas uma consulta em andamento por vez. Você não pode executar outra consulta enquanto a primeira consulta ainda tem um cursor aberto (ou seja, ainda tem resultados para retornar).
Você tem essas opções:
-
Use PDOStatement::fetchAll() e colete todo o conjunto de resultados da consulta externa em uma matriz PHP. Isso conclui o resultado da consulta externa. Em seguida, você pode fazer um loop sobre a matriz e executar uma consulta SQL adicional para cada iteração de loop.
Mas executar uma nova consulta para cada iteração de loop do conjunto de resultados externo não é eficiente. É uma boa maneira de matar o desempenho do seu aplicativo.
Algumas pessoas chamam isso de Problema de seleção N+1 porque você executa a primeira seleção, que retorna N linhas, e depois executa N seleções com base nos resultados da primeira seleção.
-
Se você usa MySQL, use PDO::MYSQL_ATTR_USE_BUFFERED_QUERY que basicamente faz a mesma coisa, baixa todas as linhas, salvas em um array internamente. Em seguida, chamadas subsequentes parafetch()
apenas iterar sobre os resultados armazenados em buffer.
Mas isso também envolve o antipadrão N+1 Selects.
-
É melhor escrever uma única consulta SQL que obtenha os valores desejados. Deduzindo de seus comentários, você deseja categorias e a contagem de linhas relacionadas de outra tabela em que category_id corresponda. Aqui está um exemplo de uma consulta SQL:
$db->pquery("SELECT c.`category_id`, c.`category_name`, COUNT(*) AS `count` FROM `database_categorys` AS c LEFT OUTER JOIN `other_table` AS t ON t.category_id = c.category_id GROUP BY c.category_id ORDER BY c.`category_name` ASC");
As junções são uma parte fundamental do SQL. Se você tentar usar SQL sem aprender a usar junções, é como usar PHP sem aprender a usar
while
rotações. Comece aqui:Uma explicação visual de Junções SQL .