6
respostas

Como gerar e listar pedidos no MySQL?

Olá,

Estou desenvolvendo um projeto de controle de estoque com PHP e MySQL e gostaria de saber como relacionar as tabelas gerar pedidos, onde em cada pedido conste o nome do cliente e a listagem dos produtos. Dei uma pesquisada e vi que teria que criar uma tabela de "ITENS", além das de "CLIENTES", "PRODUTOS" e "PEDIDOS". Mas não entendi como relacionar essas tabelas.

6 respostas

Oi Anderson, tudo bom?

Essa parte de relacionar as tabelas é muito mais tranquilo se feito com uma ferramenta chamada que mapeia seu código PHP e reflete no banco (mais conhecido como ORM). Em PHP a gente tem o Doctrine que é um ORM bem famoso e bem semântico e o Eloquent que é utilizado pelo Laravel.

Acho que vale a pena se aprofundar um pouco nesse sentido porque essa parte de relacionar tabelas pode ser realmente bem complexa.

Por exemplo, no seu caso, temos Itens, Clientes, Produtos e Pedidos.

Provavelmente um Cliente tem muitos Pedidos, um Pedido tem muitos Items e um Item tem muitos Produtos. Mas, isso pode mudar dependendo da sua regra de negócio.

Partindo do pressuposto que essa modelagem se encaixa a sua regra de negócio, no modelo relacional, precisaríamos de uma tabela clientes_pedidos com as colunas cliente_id e pedido_id para registrar todos os pedidos de todos os clientes.

Além dessa, provavelmente seria necessária outra tabela pedidos_itens com as colunas pedido_id e item_id e, finalmente, pedidos_produtos com as colunas item pedido_id e produto_id.

Com isso você consegue registrar Clientes,Produtos,Pedidos e Itens e relacionar eles com as tabelas intermediárias.

O problema disso é que todas as suas queries de consulta vão começar a precisar de mais Joins pra te retornar alguma coisa e os Joins aumentam bastante a complexidade das queries o que faz com que o manuseamento dessa base sem uma ferramenta fique bem maçante.

Espero ter ajudado =)

Abraço

Obrigado, André,

Eu talvez tenha encontrado outra solução. Criei a tabela Pedidos, que irá conter o id do pedido, id do cliente (FK), status e data, e a tabela Itens Pedidos, que irá conter o id do pedido (FK), id do produto (FK) e quantidade. Falta eu testar as queries.

Opa, e ai Anderson, testou as queries? =)

Na correria sobra pouco tempo para eu trabalhar em meu projeto, mas já consegui rodar uma query de listagem para a relação entre as tabelas Produtos e Itens Pedidos, que me retorna a lista com o nome dos produtos e a quantidade pedida em cada pedido.

Boa tarde,

Ainda estou na correia, mas tenho novidade. Consegui criar em PHP as telas que listam todos os pedidos exibindo o número do pedido, o cliente, o status do pedido (aberto, fechado, cancelado) e a data e ao clicar em cada número de pedido eu vejo seus detalhes: produtos comprados e quantidade.

O que ainda preciso é saber como gerar novos pedidos usando o PHP e realizar o cálculo total de cada pedido, levando em consideração que o preço em estoque é diferente do preço de venda para o cliente.

Por enquanto estou quebrando a cabeça para conseguir gerar os pedidos. Vou deixar aqui a descrição das tabelas tb_clientes, tb_produtos, tb_pedidos e tb_itens_pedidos respectivamente:

+----------+--------------+------+-----+---------+----------------+
| Field    | Type         | Null | Key | Default | Extra          |
+----------+--------------+------+-----+---------+----------------+
| id_cli   | int(11)      | NO   | PRI | NULL    | auto_increment |
| nome     | varchar(255) | YES  |     | NULL    |                |
| endereco | varchar(255) | YES  |     | NULL    |                |
| telefone | varchar(50)  | YES  |     | NULL    |                |
| email    | varchar(255) | YES  |     | NULL    |                |
+----------+--------------+------+-----+---------+----------------+

+---------------+--------------+------+-----+---------+----------------+
| Field         | Type         | Null | Key | Default | Extra          |
+---------------+--------------+------+-----+---------+----------------+
| id_prod       | int(11)      | NO   | PRI | NULL    | auto_increment |
| nome          | varchar(255) | YES  |     | NULL    |                |
| quantidade    | int(11)      | YES  |     | NULL    |                |
| valor         | double(9,2)  | YES  |     | NULL    |                |
| categoria_id  | int(11)      | YES  | MUL | NULL    |                |
| fornecedor_id | int(11)      | YES  | MUL | NULL    |                |
+---------------+--------------+------+-----+---------+----------------+

+-----------+--------------------------------------+------+-----+-------------------+----------------+
| Field     | Type                                 | Null | Key | Default           | Extra          |
+-----------+--------------------------------------+------+-----+-------------------+----------------+
| id_pedido | int(11)                              | NO   | PRI | NULL              | auto_increment |
| cli_id    | int(11)                              | YES  | MUL | NULL              |                |
| status    | enum('aberto','fechado','cancelado') | NO   |     | NULL              |                |
| data      | timestamp                            | NO   |     | CURRENT_TIMESTAMP |                |
+-----------+--------------------------------------+------+-----+-------------------+----------------+

+------------+---------+------+-----+---------+-------+
| Field      | Type    | Null | Key | Default | Extra |
+------------+---------+------+-----+---------+-------+
| pedido_id  | int(11) | YES  | MUL | NULL    |       |
| produto_id | int(11) | YES  | MUL | NULL    |       |
| quantidade | int(11) | YES  |     | NULL    |       |
+------------+---------+------+-----+---------+-------+

Oi Anderson, tudo bom?

Qual é sua dificuldade, exatamente, em gerar os pedidos?

Adicionar no banco?

Você está usando PHP e Mysql puros?

Da uma olhada nos cursos mais avançados de PHP e orientação a objetos para usar um ORM e se livrar dessa complexidade em mandar/resgatar entidades no banco de dados.

Aqui na Alura a gente tem um curso de Doctrine, que pode ser bem útil pra vc nesse momento =)