Jump to content

Recommended Posts

Olá!

 

Cenário: Tenho uma classe NotaFiscal que tem um relacionamento com vários outros objetos, como Cliente, Fornecedor, Produtos e etc, sendo que estes objetos ligados diretamente ainda tem seus relacionamentos com outros objetos.

 

Objetivo: Apresentar uma lista de notas fiscais quem contém poucos dados, como número da nota, nome do cliente e valor total.

 

Dúvida: Recuperar o objeto NotaFiscal e todas as suas relações em um banco de dados, por exemplo, não seria um grande problema de desempenho, visto que preciso de poucos dados? Me parece um erro obter apenas as notas sem suas relações e um exagero obter tudo. 

Share this post


Link to post
Share on other sites

Seja bem vindo ao fórum,

digamos que você tenha uma classe NotaFiscal / Comprador.


O que vamos fazer? Após o comprador efetuar uma compra, vamos gerar uma nota fiscal de acordo com a compra do cliente.

<?php
class NotaFiscal {
 private $numeroNota;
 private $idPedido;
 private $nomeCliente;
 private $valorTotal;
 private $idCliente;
  
  public function __construct($idPedido, $idCliente) {
    $this->setIdProduto($idProduto);
    $this->setIdCliente($idCliente);
    $this->atribuirValores();
  }
  
  public function retornar($idPedido, $column) {
    // query select... 
    // return $valor[$column];
  }
  
  public function atribuirValores() {
    $this->setNumeroNota($this->retornar($this->getIdPedido(), "numeroNota"));
    $this->setValorTotal($this->retornar($this->getIdPedido(), "valorTotal"));
    $this->setNomeCliente($this->retornar($this->getIdCliente(), "nomeCompleto"));
                          
  }
  
  public function escreverNota() {
   $nota = "Nome: ".$this->getNomeCliente();
   $nota .= "</br>";
   $nota .= "Numero da nota: ".$this->getNumeroNota();
   $nota .= "</br>";
   $nota .= "Valor total: ".$this->getValorTotal();
   
   echo $nota;
  }
  
  //finja que tenha os getters e setters aqui
  
}

/* COMPRA FINALIZADA COM SUCESSO! ID DO PEDIDO É 2354 */
/* ID DO USUÁRIO É 23 */

$nota = new NotaFiscal(2354, 23);
$nota->escreverNota();

 

Sendo assim, só você receber o ID do pedido e passar o ID do usuário ou receber o ID do usuário diretamente na tabela pedido.

Não entendi muito bem o que você desejava fazer. 

Use o código como base para seu algoritmo.

 

Observação: Não copie o código pois vai apresentar erros.

Share this post


Link to post
Share on other sites

Olá @jamesbond

 

Obrigado por responder minha pergunta, vou usar o código como exemplo para mostrar o que pretendo fazer:

 

<?php

$lista_de_notas = [
  # nf_id, cliente_id 
  [123, 1],
  [124, 2]
  [125, 3]
  [126, 1]
  [127, 2]
  # ...
];

foreach ($lista as $dados) {
  $NotaFiscal = new NotaFiscal($dados[0], $dados[1]);
  $NotaFiscal->escreverNota();
}

Com essa classe vou conseguir sem dúvidas atingir meu objetivo, mas o meu questionamento é quanto a performance disso, pois se o seu método "retornar" realmente fizer uma consulta ao banco a cada vez que for chamado, serão três consultas para cada Nota. Outro problema que não dá para mostrar com essa classe é que na minha ainda existe as classes de Fornecedor, Clientes e Produtos, todas relacionadas diretamente com nota. Assim:

 

<?php


class NotaFiscal
{
  private $Cliente;
  private $Fornecedor;
  private $produtos;
  # ...
  
  public function __construct(Cliente $Cliente, Fornecedor $Fornecedor) 
  {
    $this->Cliente = $Cliente;
    $this->Fornecedor = $Fornecedor;
    $this->produtos = [];
  }
  
  public function adicionarProduto(Produto $Produto): self
  {
    $this->produtos[] = $Produto;
    return $this;
  }
  
  # ...
}

Existe várias outras propriedades e métodos, a minha principal dúvida é quanto a obtenção das classes Cliente, Fornecedores e Produtos que também tem vários dados, quando em determinado momento só vou imprimir o número da nota e seu valor.

 

Estou fazendo isso certo?

Share this post


Link to post
Share on other sites
5 horas atrás, Johnny Saymon disse:

Olá @jamesbond

 

Obrigado por responder minha pergunta, vou usar o código como exemplo para mostrar o que pretendo fazer:

 

Com essa classe vou conseguir sem dúvidas atingir meu objetivo, mas o meu questionamento é quanto a performance disso, pois se o seu método "retornar" realmente fizer uma consulta ao banco a cada vez que for chamado, serão três consultas para cada Nota. Outro problema que não dá para mostrar com essa classe é que na minha ainda existe as classes de Fornecedor, Clientes e Produtos, todas relacionadas diretamente com nota. Assim:

 

Existe várias outras propriedades e métodos, a minha principal dúvida é quanto a obtenção das classes Cliente, Fornecedores e Produtos que também tem vários dados, quando em determinado momento só vou imprimir o número da nota e seu valor.

 

Estou fazendo isso certo?

 

Pesquise sobre Facade/Builder. Acho que ajuda em seu caso.

Quanto a consulta ao banco de dados, isso é relativo. Basta saber relacionar as tabelas.

Por exemplo aqui no fórum, cada mensagem corresponde a um usuário, na tabela tópicos existe a column ID USER ou seja com o ID do usuário na tabela tópico o mesmo faz uma consulta para receber o Nome do usuário.
Se um tópico tem 100 mensagens, olha quantas consultas foram executadas. Basta saber dividir as mesmas.

No seu caso, creio que não irá atrapalhar a performance.

  • +1 1

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By marcosAUG
      Crie uma classe que defina um vetor no plano. Crie métodos para permitir obter o versor, módulo e somar ao vetor uma série de outros vetores (usando *args), calcular o produto escalar e produto vetorial

      Uma duvida é de como usar a função *args nos métodos que o enunciado pede, e se tenho que mudar os métodos e atributos anteriores?
      class Vetor: def __init__(self, x, y, *args): self.__x = x self.__y = y def modulo(self): return (self.__x**2 + self.__y**2 )**(1/2) def versor(self): v1 = (self.__x)/(self.__x**2 + self.__y**2 )**(1/2) v2 = (self.__y)/(self.__x**2 + self.__y**2 )**(1/2) return v1, v2 def soma(self): pass def produto_escalar(self): pass def produto_vetorial(self): pass vetorA = Vetor(4,3) print("Modulo: ", vetorA.modulo()) print("Versor: ", vetorA.versor()) print("Soma: " )  
    • By Jeovane Carvalho
      Salve pessoal  tudo bem !
      Depois de muito tempo venho aqui pedir uma ajuda , bem vamos lá...
      Eu tenho uma classe POO e nela pego algumas variáveis que vem como array e uso o implode para enviar através do load do javascript.
      Até aí tranquilo, eu resgato com $_GET  usando o explode, e depois uso implode para separar elas novamente.
      Montei essa rotina toda por se tratar de uma o paginação se reload , bem dinâmica , só que ao passar os parâmetros e as variáveis no bind_param da erro de parâmetros, dizendo que :
       
      Warning: mysqli_stmt::bind_param(): Number of variables doesn't match number of parameters in prepared statement
      E entendi que o erro diz que o número de parametros não condiz com o número de variáveis, E AI QUE ENTRA A MINHA DOR DE CABEÇA...
      Mesmo eu usando implode eu consigo separar as variáveis mas dando um var_dump elas  ficam juntas  e a execução do prepare lê como uma única variável.
      Segue o código abaixo:
       
      <?php class DadosFiltroBusca { private $conecta_banco; public function __construct(){ $this->conecta_banco= new Conexao(); $this->conecta_banco->Conectar(); } public $ativo; public $negocio ; public $tipo; public $cidade; public $bairro; public $id_negocio; public $id_tipo; public $id_cidade; public $id_bairro; public $foto; public $where; public $sqlT_1; public $sqlT_2; public $total; public $current_page; public $get_total_rows; public $item_per_page; public $total_pages; public $total_records; public $pgst; public $page_number; public $page_position ; public $filtro_dados; public $site; public function BuscarFiltroBusca(){ $result=$this->conecta_banco->banco; $this->item_per_page = 4; if(isset($_POST["page"])){ $this->page_number =(isset($_POST['page'])) ? (int)$_POST['page'] : 1; if(!is_numeric($this->page_number)){die('Página inválida!');} //incase of invalid page number }else{ $this->page_number = 1; //if there's no page number, set it to 1 } $negocio = $_GET['negocio']; $this->id_tipo= explode(",",$_GET['tipo']); $this->id_cidade=explode(",",$_GET['cidade']); $this->id_bairro=explode(",",$_GET['bairro']); $idi=implode('', $this->id_tipo); echo "<br /><br />"; $in=(is_array($this->id_tipo) ? count($this->id_tipo):0); $id_tipo = implode(',', array_fill(0, $in, '?')); echo " :: " . $id_tipo_2 =join('', array_fill(0, 1, $idi)); echo " :: ".$types =str_repeat('s',$in); echo "<br /> VAR:: ".$tipo =str_repeat(''.$id_tipo_2.'',1); var_dump ($tipo ); $idi1='5'; $idi2='11'; foreach ($this->id_cidade as $key=> $id_cidade): foreach ($this->id_bairro as $key=> $id_bairro): $ativo='1'; "%".$negocio."%"; $id_tipo; $id_cidade; $id_bairro; echo "<br /><br />RESULTADO :: ". $t='ss'.$types.'ss',$ativo,$negocio,$tipo ,$id_cidade,$id_bairro."<br /><br />"; $where = " i.ativo =? "; if( $negocio) { $where .="AND i.id_negocio_tipo LIKE ?"; }if( $id_tipo ) { $where .=" AND i.id_tipo_imovel IN ($id_tipo)"; } if( $id_cidade ) { $where .=" AND i.id_cidade=?"; } if($id_bairro) { $where .=" AND i.bairro=?"; } $sqlT_1 =$result->prepare("SELECT i.*, t.tipo_nome, b.bairro, n.tipo, c.cidade FROM imoveis i LEFT JOIN negocio_tipo n ON (n.id = i.id_negocio_tipo) LEFT JOIN imoveis_tipo t ON (t.id = i.id_tipo_imovel) LEFT JOIN cidades c ON (c.id = i.id_cidade) LEFT JOIN bairros b ON (b.id = i.bairro) WHERE ".$where.""); $sqlT_1->bind_param('ss'.$types.'ss',$ativo,$negocio,$tipo ,$id_cidade,$id_bairro); $sqlT_1->execute(); $this->sqlT_1 = $sqlT_1->get_result(); $this->get_total_rows+=$this->sqlT_1->num_rows; if($this->get_total_rows >0 ){ $this->total_pages = ceil($this->get_total_rows / $this->item_per_page); } $this->sqlT_1->num_rows; //break records into pages //get starting position to fetch the records if($this->get_total_rows > 0 ){ $this->page_position = (($this->page_number * $this->item_per_page) -$this->item_per_page); $this->pgst = ceil($this->get_total_rows / $this->item_per_page); } $sqlT_1->close(); endforeach; endforeach; $sqlT_2 =$result->prepare("SELECT i.id, i.valor,i.locacao, i.foto_exibicao,i.latitude,i.longitude, i.quartos, i.garagem,i.mapa, i.codigo, t.tipo_nome, n.tipo AS negocio, c.cidade, c.uf, b.bairro FROM imoveis i LEFT JOIN negocio_tipo n ON (n.id = i.id_negocio_tipo) LEFT JOIN imoveis_tipo t ON (t.id = i.id_tipo_imovel) LEFT JOIN cidades c ON (c.id = i.id_cidade) LEFT JOIN bairros b ON (b.id = i.bairro) WHERE ".$where." ORDER BY i.id DESC LIMIT ?,?"); $sqlT_2->bind_param('sssssss',$ativo,$negocio,$idi,$id_cidade,$id_bairro,$this->page_position,$this->item_per_page); $sqlT_2->execute(); $this->sqlT_2=$sqlT_2->get_result(); } } ?> Vejam no código que existem 2 consultas, um select é para montar a páginação sem reflesh e a outra é para buscar os dados do filtro de busca , e para deixar mais claro, se eu colocar no lugar cláusula IN em vez de IN (?) colocar IN ($variavel ) que já foi separada com o implode ela busca perfeitamente as informações , exemplo abaixo:
       
      $where = " i.ativo =? "; if( $negocio) { $where .="AND i.id_negocio_tipo LIKE ?"; }if( $id_tipo ) { $where .=" AND i.id_tipo_imovel IN (?)"; AQUI É AONDE TEM O ARRAY, E AS OUTRAS ESTÃO SEM ARRAYS PARA TESTAR APENAS ESSA VARIÁVEL } if( $id_cidade ) { $where .=" AND i.id_cidade=?"; } if($id_bairro) { $where .=" AND i.bairro=?"; } Acima da aquele erro de; Warning: mysqli_stmt::bind_param(): Number of variables doesn't match number of parameters in prepared statement
      Mas agora logo abaixo vai de boa e forma a paginação e trás os valores:
       
      $where = " i.ativo =? "; if( $negocio) { $where .="AND i.id_negocio_tipo LIKE ?"; }if( $id_tipo ) { $where .=" AND i.id_tipo_imovel IN ($id_tipo)"; } if( $id_cidade ) { $where .=" AND i.id_cidade=$id_cidade"; } if($id_bairro) { $where .=" AND i.bairro=$id_bairro"; }  
      E vi que o problema esta aqui abaixo:
      $sqlT_1->bind_param('ss'.$types.'ss',$ativo,$negocio,AQUI É A VARIÁVEL COM ARRAY -> $tipo ,$id_cidade,$id_bairro); Notem que esta variável dentro dos parâmetros ($types) ela trás o número de parâmetros conforme o critério de busca do filtro de busca, E este parametro como variável eu pego com o str_repeat
      E  se eu montar as variáveis manualmente tipo > $tipo1=15'; e $tipo2='11'; e jogar lá no bind param ela chama de boa tipo assim :
       
      $tipo1='15'; $tipo2='11' $sqlT_1->bind_param('ss'.$types.'ss',$ativo,$negocio,$tipo1,$tipo2 ,$id_cidade,$id_bairro); se eu fizer desta forma chama perfeitamente, e vi que o problema é na hora de separar as variáveis do array.
      Já usei serialize, join, json_decode e nada .
      Se alguém souber de como contornar agradeço. E desculpe pela imensa explicação , mas é para entederem melhor :)
      Obrigado !
       
    • By lucascientista
      Boa noite pessoal, sou iniciante no php e tenho uma dúvida que eu acho que pode ser bem simples para vocês que estão mais avançados do que eu. Bom, eu gostaria de saber como usar a orientação ao objeto para cadastro no banco de dados - mysql, só que eu não sei fazer da maneira orientada ao objeto e gostaria de saber.
       
      <?php class Pessoa { $nome; $sobrenome; $endereço; } gostaria de saber como usar uma classe parecida a de cima com o banco de dados
      Muito obrigado, toda ajuda é bem vinda
    • By vinicius59
      Então... há algum tempo venho pesquisando em vários sites sobre a duvida que eu tenho, ela se consiste em como eu posso fazer (2 botoes) que ao ser acionado cria-se um quadrado pequeno de uma cor que eu vou escolher! Se alguém poder responder 'Me desculpem se essa duvida não for relacionada ao php sou novo aqui'.
    • By Guss
      Boa noite galera, to com um trabalho para entregar daqui a pouco e gostaria da ajuda de vocês a me ajudar a resolver essa questão:
      Desenvolva um programa utilizando PHP para exibir os resultados desse programa que tenha todas as classes suficientes para que:
       
      Exista uma classe DiferencaData, que possui um método chamado calculaDias, que recebe como parâmetro duas datas e calcula a diferença em dias entre essas datas. Considere que sempre a primeira data fornecida é maior do que a segunda. Considere para efeitos de simplificação que todo mês tem 30 dias e um ano com 365 dias
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.