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

PDO Inserir venda e itemVenda na mesma tela

Olá pessoal, estou desenvolvendo um tela mestre detalhes, na mesma tela o usuário entrar com dados da venda e item da venda. Para isso estou inserindo primeiro a Venda para gerar o ID, após isso tenho que passar esse ID para gravar os itens da venda.

A dúvida é como obter o ID da venda, estou fazendo algo do tipo:

function inserir($conexao, $foco, $dtaFolha, $notaDia, $observacao){
    $query = "INSERT INTO FOLHA VALUES(:foco, :nota_dia, :dta_folha, :observacao, :status)";

    try{

        $stmt = $conexao->prepare ( $query );
        $stmt->bindValue ( ':foco',$foco );
        $stmt->bindValue ( ':nota_dia', $notaDia );
        $stmt->bindValue ( ':dta_folha', $dtaFolha );
        $stmt->bindValue ( ':observacao', $observacao );
        $stmt->bindValue ( ':status', 1 );
        $stmt->execute ();


        return $idFolhaGerado = $conexao->lastInsertId();    

Estou pegando o id com esse comando

$conexao->lastInsertId();

mas se vários usuários estiverem inserindo ao mesmo tempo? como vou garantir que o sistema retorne o ID correto?

4 respostas

Oi Hermogenes, tudo bom?

A função lastInsertedId apenas retorna o valor do last insert id do mysql . Então, independente de quantas threads/conexões estejam rolando na sua aplicação, todas elas vão ter seu valor de last insert id correto no momento correto =)

Então não corro o risco de gravar obter o id de uma entidade errada? dessa forma eu garanto que o ID retornado é o ID que acabou de ser inserido?

Outra pergunta, nesse exemplo estou primeiro gravando por exemplo uma venda e só depois de gravado insiro os itens dessa venda, você aconselharia gravar a Venda e os itens no mesmo método?

=)

solução!

Então não corro o risco de gravar obter o id de uma entidade errada? dessa forma eu garanto que o ID retornado é o ID que acabou de ser inserido? Não, a menos que você insira duas instâncias na mesma tabela na mesma conexão o id retornado sempre será o correto.

Outra pergunta, nesse exemplo estou primeiro gravando por exemplo uma venda e só depois de gravado insiro os itens dessa venda, você aconselharia gravar a Venda e os itens no mesmo método? Aqui, é legal ter os dois métodos com as queries de inserção, uma pra cada tabela e utilizar esses métodos em um que encapsule os dois. Algo como:

public function inserirVendaComItems($vendaComItems)
{    
     inserirVenda($vendaComItems);

    foreach($vendaComItems->items as $item) {
        public function inserirItem($item);
    }
}

Perfeito obrigado.