estrutura
Salve pessoal,
Fui responder a duvida de um colega, e me apareceu outra duvida...
Caso eu tenha um banco de dados relacional tradicional, Ex:
create database loja_imaster;
use loja_imaster;
CREATE TABLE fornecedor(
id int(8) primary key auto_increment
,nome varchar(50)
);
INSERT INTO fornecedor (nome) values ('Intel'), ('Amd');
CREATE TABLE produtos(
id int(8) primary key auto_increment
,nome varchar(50)
,valor decimal(5,2)
,fornecedor_id int (8)
);
INSERT INTO produtos (nome, valor, fornecedor_id) values
('AMD 29030' , 78.18, 2)
,('Athlon' , 500.30, 2)
,('Phenom FX' , 542.82, 2)
,('Phenom X4' , 210.50, 2)
,('Phenom X2' , 111.18, 2)
,('Pentium 4' , 540.18, 1)
,('Core i7' , 900, 1)
,('Core i5' , 500, 1)
,('Core i3' , 300, 1)
,('Xeon série 7000' , 1245.18, 1)
,('Core Duo' , 500.50, 1)
,('Xeon' , 200.78, 1)
,('Pentium Dual-Core' , 15.44, 1)
;
Basicamente aquele velho exemplo...Produtos x Fornecedor
E eu queira criar a estrutura da foto abaixo:
JSON-TEXT:
[{"id":"9","fornecedor_id":"1","fornecedor_nome":"Intel","produtos":[{"id":"9","nome":"Core i3","fornecedor_id":"1"},{"id":"7","nome":"Core i7","fornecedor_id":"1"},{"id":"12","nome":"Xeon","fornecedor_id":"1"},{"id":"10","nome":"Xeon s\u00e9rie 7000","fornecedor_id":"1"},{"id":"8","nome":"Core i5","fornecedor_id":"1"},{"id":"6","nome":"Pentium 4","fornecedor_id":"1"},{"id":"13","nome":"Pentium Dual-Core","fornecedor_id":"1"},{"id":"11","nome":"Core Duo","fornecedor_id":"1"}]},{"id":"5","fornecedor_id":"2","fornecedor_nome":"Amd","produtos":[{"id":"5","nome":"Phenom X2","fornecedor_id":"2"},{"id":"3","nome":"Phenom FX","fornecedor_id":"2"},{"id":"1","nome":"AMD 29030","fornecedor_id":"2"},{"id":"4","nome":"Phenom X4","fornecedor_id":"2"},{"id":"2","nome":"Athlon","fornecedor_id":"2"}]}]
Alguém sabe se tem alguma maneira facilitada?Consegui apenas da seguinte maneira:
$conn = mysqli_connect("localhost", "root", "", "loja_imaster");
mysqli_set_charset ($conn , 'utf8');
$sql = '
select
produtos.id
,produtos.nome
,fornecedor.id as fornecedor_id
,fornecedor.nome as fornecedor_nome
from
fornecedor
inner join produtos on(
produtos.fornecedor_id = fornecedor.id
)
order by fornecedor_id
';
// $stmt = mysqli_query($conn, 'set utf8');
$stmt = mysqli_query($conn, $sql);
if (!$stmt) {
//echo "Não foi possível executar a consulta ($sql) no banco de dados: " . mysql_error();
echo mysqli_errno($conn) . ": " . mysqli_error($conn) . "\n";
die();
}
//$produtos = mysqli_fetch_assoc($stmt);
$produtos = mysqli_fetch_all($stmt, MYSQLI_ASSOC);
$noSql = array();
$last_fornecedor = 0;
$grafo = array();
for($i = 0; $i < count($produtos); $i++){
$produto = $produtos[$i];
if($last_fornecedor == 0 || $last_fornecedor != $produto['fornecedor_id']){
unset($produto['nome']);
$produto['produtos'] = array();
$grafo[] = $produto;
}
$last_fornecedor = $produto['fornecedor_id'];
}
// print_r($grafo);die();
foreach($produtos as $prod){
unset($prod['fornecedor_nome']);
for($i = 0; $i < count($grafo); $i++){
if($prod['fornecedor_id'] == $grafo[$i]['fornecedor_id']){
// unset($prod['fornecedor_id']);
$grafo[$i]['produtos'][] = $prod;
}
}
}
//Exibe estilo grafo.
// print_r($grafo);
header('Content-Type: application/json; charset=utf-8');
print json_encode($grafo);//Saida:
//[{"id":"9","fornecedor_id":"1","fornecedor_nome":"Intel","produtos":[{"id":"9","nome":"Core i3","fornecedor_id":"1"},{"id":"7","nome":"Core i7","fornecedor_id":"1"},{"id":"12","nome":"Xeon","fornecedor_id":"1"},{"id":"10","nome":"Xeon s\u00e9rie 7000","fornecedor_id":"1"},{"id":"8","nome":"Core i5","fornecedor_id":"1"},{"id":"6","nome":"Pentium 4","fornecedor_id":"1"},{"id":"13","nome":"Pentium Dual-Core","fornecedor_id":"1"},{"id":"11","nome":"Core Duo","fornecedor_id":"1"}]},{"id":"5","fornecedor_id":"2","fornecedor_nome":"Amd","produtos":[{"id":"5","nome":"Phenom X2","fornecedor_id":"2"},{"id":"3","nome":"Phenom FX","fornecedor_id":"2"},{"id":"1","nome":"AMD 29030","fornecedor_id":"2"},{"id":"4","nome":"Phenom X4","fornecedor_id":"2"},{"id":"2","nome":"Athlon","fornecedor_id":"2"}]}]
A ideia basicamente é facilitar o Front-End explorando uma maneira estilo ?'grafo'? (array dentro de arrays)? Exemplo:
https://fiddle.jshell.net/w5zbmxmh/
Nunca tinha pensando em estruturas assim e faz bastante sentido em alguns casos principalmente em relacionamentos estilo arvores:
\
\
/ \ (Fornecedor)
/ \ (Computadores compatíveis)
/ \ (etc)
Enfim se alguém tiver matéria a compartilhar ou dicas de como deixar mais limpo (sem fazer 2x consultas no banco) seria bacana.Abraço a todos
Update:
Joguei a duvida no GitHub (Forum - frontendbr) pra envolver mais gente, caso queiram acompanhar:
Discussão (8)
Carregando comentários...