[PROMOÇÃO] Assine com + 30% de desconto ANUAL MENSAL (últimas horas)
HOLDING DE A. E PART. S.A. ­ HALIPAR
Criador HOLDING DE A. E PART. S.A. ­ HALIPAR 13/03/2023

Boa tarde Professor,

Imagina que temos duas tabelas:

               produto_cliente e estoque_loja

quando o cliente faz uma compra, eu crio um registro em produto_cliente e ao mesmo tempo atualizo o estoque_loja. Nesse caso eu utilizaria o beginTransaction no back end da aplicação, já que se ocorrer algum problema durante o processo eu precisaria dar um "rollback" nos inserts e update. 

Gostaria de saber como implementar a lógica de beginTransaction quando mais de uma tabela fosse afetada. Isso ficaria em services? como implementaria com a arquitetura que você montou utilizando os controllers, services e repositories? 

Sei que os controllers só terão validações de seus requests, chamadas para services e os seus respectivos retornos. Logo, qual seria a camada mais correta para aplicar o begin e como fazer isso exatamente?  

Manager Carlos Ferreira 13/03/2023

Olá, tudo bem?

Como é algo relacionado a banco de dados (persistência), deixa na camada de repositories.

use Illuminate\Support\Facades\DB;
DB::beginTransaction();

try {
    // insere tb1

    // insere tb2

    DB::commit();
} catch (\Exception $e) {
    DB::rollBack();
    // assim deixa a excessão subir (poderia até trabalhar com excessão personalizada)
    thrown new $e;
}

Carlos Ferreira
Criador HOLDING DE A. E PART. S.A. ­ HALIPAR 13/03/2023

Mas professor, para eu persistir os dados na tb2 eu acesso via Repository da tb2, não manipulo direto da model da tb2, correto ?

Devo fazer a injeção do Repository da tb2 no Repository da tb1 pelo constructor ?

HOLDING DE A. E PART. S.A. ­ HALIPAR
Manager Carlos Ferreira 13/03/2023

Entendi, neste caso, você injeta os dois repositórios no seu service.

try {
    $this->repository->create($data1);

    $this->otherRepository->create($data2);

    DB::commit();
} catch (\Exception $e) {
    DB::rollBack();
    // assim deixa a excessão subir (poderia até trabalhar com excessão personalizada)
    thrown new $e;
}

Carlos Ferreira
Sabe a Solução? Ajude a resolver!

Precisa estar logado para conseguir responder a este ticket!

Clique Aqui Para Entrar!