Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Orientação a objetos

Bom dia, possuo uma dúvida que foge do escopo dessa aula, porém é uma dúvida relacionada ao curso.

Supomos que na classe *Produtos eu tivesse várias categorias e em determinado momento, apresentasse o nome do Produto e uma soma de quantas categorias esse produto tivesse, exemplo: Produto: Chocolate - 6 categorias.

No banco eu teria uma tabela Produtos , Categorias e *Produto_Categoria ( com os campos idProdutos e idCategorias) para ligar as 2, correto?

Pois bem, seria correto eu fazer uma lista(array) de categorias dentro da classe Produtos e iterar pela mesma ao recuperar o total de categorias ou apenas fazer um campo dentro de *Produtos, exemplo: - totalDeCategorias e ao fazer os JOIN's no banco, adicionar esse valor ao campo.

Para ser mais claro, é correto eu ter um campo como o totalDeCategorias em uma classe *Produtos em que eu não tenho uma representação do mesmo no banco?

Espero ter sido claro, e desculpe o longo texto, sei que daria para fazer de várias maneiras, minha dúvida é se tudo que eu represento no banco, eu preciso ter em minhas classes e vice-versa. Obrigado

3 respostas
solução!

Oi, João. Sua classe não precisa ser igual a sua tabela no banco. No caso que você apresentou eu não colocaria um campo na tabela de Produtos com o total de categorias, pois não me parece certo. Visto que eu já vou estar adicionando as categorias na tabela de ligação (Produto_Categoria). Então o ideal seria buscar pelas categorias do produto e aí sim conta-las. Mas cada caso é um caso, talvez se você estiver trabalhando com um volume muito alto de dados poderia ser interessante.

Mais uma coisa, caso eu tivesse uma lista de Categorias dentro de Produtos, eu poderia fazer algo do tipo:

<?php

class Produtos {

public $id; public $nome; public $preco;

public $categorias= array();

function adicionaCategoria(Categoria $categoria ){ if(!in_array($categoria , $this->categorias)){ $this->categorias.push($categoria); return true; } else{ return false; } }

function removeCategoria(Categoria $categoria){ if(in_array($categoria, $this->categorias)){ $this->categorias.unset($categoria); return true; }else{ return false; } }

}

João oque você pode fazer é, junto do join que você faz para trazer o produto e suas categorias você usar o count do sql e dar um nome para ele como ele fosse um campo adicional . E outra coisa, não é legal replicar dando que estão no banco em seu codigo já que você pode fazer um select e buscar todas as suas categorias no banco.