Resumo : neste tutorial, você aprenderá como usar o PDO::FETCH_GROUP
modo para agrupar as linhas selecionadas pela primeira coluna.
Introdução ao modo PDO::FETCH_GROUP
O PDO::FETCH_GROUP
permite agrupar linhas do conjunto de resultados em um array aninhado , onde os índices serão os valores exclusivos da coluna e os valores serão arrays das colunas restantes.
Por exemplo, se você tiver uma consulta como esta:
SELECT role, username, email
FROM users;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
O PDO::FETCH_GROUP
modo retornará a seguinte saída:
[
'admin' => [
0 => [
'username' => 'admin',
'email' => '[email protected]'
],
1 => [
'username' => 'bob',
'email' => '[email protected]'
]
]
'contributor' => [
0 => [
'username' => 'alex',
'email' => '[email protected]'
],
1 => [
'username' => 'alice',
'email' => '[email protected]'
]
]
]
Linguagem de código: PHP ( php )
Isso PDO::FETCH_GROUP
é útil caso você queira agrupar linhas por valores exclusivos da primeira coluna no conjunto de resultados. Por exemplo, você pode usar PDO::FETCH_GROUP
para selecionar dados para gerar agrupamentos de opções dentro de um elemento selecionado.
O exemplo PDO::FETCH_GROUP
O exemplo a seguir seleciona os livros e editoras da tabela books
e publishers
. O PDO::FETCH_GROUP
grupo agrupa os livros pelos nomes das editoras:
<?php
$pdo = require 'connect.php';
$sql = 'SELECT name, book_id, title
FROM publishers p
INNER JOIN books b ON b.publisher_id = p.publisher_id';
$statement = $pdo->query($sql);
$publishers = $statement->fetchAll(PDO::FETCH_GROUP | PDO::FETCH_ASSOC);
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Books</title>
</head>
<body>
<label for="book">Select a book:</label>
<select name="book" id="book">
<?php foreach ($publishers as $publisher => $books) : ?>
<optgroup label="<?php echo $publisher ?>">
<?php foreach ($books as $book) : ?>
<option value="<?php echo $book['book_id'] ?>"><?php echo $book['title'] ?></option>
<?php endforeach ?>
</optgroup>
<?php endforeach ?>
</select>
</body>
</html>
Linguagem de código: PHP ( php )
Como funciona.
Primeiro, conecte-se ao banco de dados usando o connect.php
script. O script retorna uma instância do objeto PDO:
$pdo = require 'connect.php';
Linguagem de código: PHP ( php )
Em seguida, construa uma instrução SQL para selecionar o nome do editor na publishers
tabela e o ID e título do livro na books
tabela:
$sql = 'SELECT name, book_id, title
FROM publishers p
INNER JOIN books b ON b.publisher_id = p.publisher_id';
Linguagem de código: PHP ( php )
Observe que a consulta usa INNER JOIN
cláusula para combinar dados de duas tabelas. Se você não está familiarizado com INNER JOIN, pode conferir o INNER JOIN
tutorial.
Em seguida, execute a instrução SQL usando o método query() do objeto PDO:
$statement = $pdo->query($sql);
Linguagem de código: PHP ( php )
Depois disso, busque as linhas do conjunto de resultados usando os modos PDO::FETCH_GROUP
e PDO::FETCH_ASSOC
:
$publishers = $statement->fetchAll(PDO::FETCH_GROUP | PDO::FETCH_ASSOC);
Linguagem de código: PHP ( php )
Por fim, crie um agrupamento de opções para um elemento selecionado usando um loop foreach aninhado. O loop foreach externo cria o elemento optgroup. E o loop interno cria os elementos de opção.
<label for="book">Select a book:</label>
<select name="book" id="book">
<?php foreach ($publishers as $publisher => $books) : ?>
<optgroup label="<?php echo $publisher ?>">
<?php foreach ($books as $book) : ?>
<option value="<?php echo $book['book_id'] ?>"><?php echo $book['title'] ?></option>
<?php endforeach ?>
</optgroup>
<?php endforeach ?>
Linguagem de código: PHP ( php )
Resumo
- Use
PDO::FETCH_GROUP
para agrupar linhas de um conjunto de resultados pela primeira coluna selecionada.